是这样的,现在计算机中表示有符号数用的几乎都是2的补码表示法(two's complement),像C语言中的int、long等就是用这种表示法。而表示无符号整数(即非负整数,如unsigned int)用的是原码表示,计算其十进制真值时直接按权展开就行。
将用2的补码表示的二进制转化成十进制有好几种方法,最规范的一种是按下面的公式计算:
x[n-1]×(-2^(n-1)) + x[n-2]×2^(n-2)+ … + x[1]×2^1 + x[0]×2^0
其中n表示二进制位数,x[n-1]表示第n-1位数(从0开始,从右往左数),注意最高位是乘以(-2^(n-1)),有负号,其它项无负号。
比如设(1111)B用2的补码表示,上面的公式计算其十进制真值的过程是:
........(1111)B =1×(-2^3) + 1×2^2 + 1×2^1 + 1×2^0
................= -8 + 4 + 2 + 1
................= -1
所以(1111)B = (-1)D
实际上,2的补码表示的16位二进制,其十进制真值如下:
……二进制……………………十进制
0000 0000 0000 0000............0
0000 0000 0000 0001............1
0111 1111 1111 1110............32766
0111 1111 1111 1111............32767
1111 1111 1111 1111............-1
1111 1111 1111 1110............-2
1000 0000 0000 0001............-32767
1000 0000 0000 0000............-32768
所以楼主在上面写的“32767即二进制的1111111111111111”是不对的,(1111 1111 1111 1111)B表示十进制数的 -1。
2的补码表示法(其它表示法还有1的补码表示法、移码表示法等)是在计算机组成原理课程中讲的。
要了解更多2的补码表示法,楼主可以Google中搜索“Two's complement”,或者参考:
http://tieba.baidu.com/f?kz=278455703
计算机内的数据都是补码形式的。因为正数的补码和原码相同,所以正数存放的是他的原码,负数是存放的他的补码(补码求法:取负数的绝对值写成二进制形式,按位取反,加1,就得到了他的补码),这样是为了计算机运算时的简单。【-32767】补=10000000 00000001 【32767】补=【32767】原=01111111 11111111
计算-32767+32767时计算机内的运算就是:10000000 00000001+01111111 11111111=00000000 00000000
是不是简单很多呢?这下明白了吧?
最前面的一位是表示它的符号!