为什么8位有符号数的范围为[-128, 127]?


Posted on July 3, 2013


这是一个困惑了我很几年的问题,每一本语言书上都会写8位有符号的取值范围是-128~+127,至于为什么不是-127~+127,不求甚解的做法维持了好几年,前一阵子,工作中需要确定SACEM的取值范围,总算是研究了一下。

涉及非常非常基础的原码、反码、补码知识。

如果用8位来表示无符号整数的话,范围是0 - 255了,无异议,加上符号,用最高位表示,0为正,1为负,范围自然就变成了-127 - 127,这也是无异议的,-127 - 127的这个说法是我们平时交流时使用的说法,对应于计算机中的原码,但是在计算机中,数字并不是以原码保存,而是以补码保存。

正数的补码与原码相同,负数的补码为原码除符号位以外取反加1。

这里就有一个很奇葩的数字了:0!我们对0的理解是,+0和-0一样,都是0,但是计算机中就不一样了。下面穷举的例子就可以看出来:

正数,原码跟补码一样 


+127, 0111 1111 
+126, 0111 1110 
+125, 0111 1101 
+124, 0111 1100 
+123, 0111 1011 
+122, 0111 1010 
... 
  +4, 0000 0100 
  +3, 0000 0011 
  +2, 0000 0010 
  +1, 0000 0001 
   0, 0000 0000 

下面是负数了,值,原码,符号位不变其它取反,符号位不变其它取反+1 


  -1, 1000 0001, 1111 1110, 1111 1111 
  -2, 1000 0010, 1111 1101, 1111 1110 
  -3, 1000 0011, 1111 1100, 1111 1101 
  -4, 1000 0100, 1111 1011, 1111 1100 
  -5, 1000 0101, 1111 1010, 1111 1011 
  -6, 1000 0110, 1111 1001, 1111 1010 
  -7, 1000 0111, 1111 1000, 1111 1001 
  -8, 1000 1000, 1111 0111, 1111 1000 
  -9, 1000 1001, 1111 0110, 1111 0111 
-10, 1000 1010, 1111 0101, 1111 0110 
-11, 1000 1011, 1111 0100, 1111 0101 
-12, 1000 1100, 1111 0011, 1111 0100 
-13, 1000 1101, 1111 0010, 1111 0011 
-14, 1000 1110, 1111 0001, 1111 0010 
-15, 1000 1111, 1111 0000, 1111 0001 
-16, 1001 0000, 1110 1111, 1111 0000 
-17, 1001 0001, 1110 1110, 1110 1111 
... 
-24, 1001 1000, 1110 0111, 1110 1000 
... 
-99, 1110 0011, 1001 1100, 1110 0100 
... 
-124, 1111 1100, 1000 0011, 1111 1101 
-125, 1111 1101, 1000 0010, 1000 0011 
-126, 1111 1110, 1000 0001, 1000 0010 
-127, 1111 1111, 1000 0000, 1000 0001 

再继续下去,下一个补码当然是

-128, 先略过,再略过, 1000 0000 

原码到补码,补码到原码的方法是一样的,1000 0000的原码是1 1000 0000, 超过8位了。1000 0000 在原码表示什么呢? -0?

补码规定0是没有正负之分的。

计算机里是这么运算的:对于负数,先取绝对值,然后求反,同时加1,
-128 -> 128 -> 1000 0000 -> 0111 1111 -> 1000 0000 

所以,,8位有符号的整数取值范围的补码表示,1000 0000 到 0000 0000,再到 0111 1111,即 -128 到 0,再到127,最终 -128 ~ +127。

参考资料:

http://baike.baidu.com/view/377340.html?wtp=tt
http://baike.baidu.com/view/742694.htm?fr=ala0_1
http://baike.baidu.com/view/60480.htm
http://www.cppblog.com/goal00001111/archive/2010/04/16/112745.html


标签:N/A

 

在线学习答案查询入口
微信扫码联系
微信扫码联系