有关C语言中int型数据的取值范围的问题
的有关信息介绍如下:是这样的,现在计算机中表示有符号数用的几乎都是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............-327671000 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