有关C语言中int型数据的取值范围的问题

int型的数值范围为-32768~32767,且int型数据占有2个字节,也就是16位,但是,第一位是0表示正,是1表示负。
但是这个-32768即二进制的0111111111111111,32767即二进制的1111111111111111.是怎么算的啊?
我算到15位,整数是32767啊。如果0为正的话。那怎么用-的32768表示0111111111111111呢??如果1为负的话。那为什么又用正的32767表示1111111111111111呢?不理解。想了两天了,找不到答案。各位大侠帮帮忙吧!!
谢谢大哥啊!!不过,补码在哪些书里有介绍啊???我不太了解补码!!!

是这样的,现在计算机中表示有符号数用的几乎都是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个回答  2009-02-04
计算机内的数据都是补码形式的。因为正数的补码和原码相同,所以正数存放的是他的原码,负数是存放的他的补码(补码求法:取负数的绝对值写成二进制形式,按位取反,加1,就得到了他的补码),这样是为了计算机运算时的简单。【-32767】补=10000000 00000001 【32767】补=【32767】原=01111111 11111111
计算-32767+32767时计算机内的运算就是:10000000 00000001+01111111 11111111=00000000 00000000
是不是简单很多呢?这下明白了吧?
第2个回答  2009-02-05
最前面的一位是表示它的符号!

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网