专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

对于八位类型,为什么表示为-128~127

发布时间:2011-06-28 16:22:40 文章来源:www.iduyao.cn 采编人员:星星草
对于8位类型,为什么表示为-128~127?
我google了一翻,胡乱理解如下。请大家说说自己的想法,谢谢。

对于一种8 bit类型,现在来看其整型值表示。对于unsigned型,取值范围是0 ~ 28-1,即0 ~ 255,共256个数值。对于signed类型,取值范围至少从-127 ~ 127,具体由编译器决定如何实现,大多数实现为-128 ~ 127。(为什么是-128 ~ 127?我这里瞎理解一下。首先-128 ~ 127正好是256(28)个数值。这种实现最常见的策略是最高位为符号位,符号位为1,值为负,符号位为0,值为正。本来是-0到-127,+0到+127。实际数值在内存中是以补码表示的,正数的补码与其原码(即该数的二进制形式)相同,+0到+127即0000 0000到0111 1111。负数的补码是其二进制形式的符号位不变,其他位取反再加1。所以-1到-127,其补码为1111 1111到1000 0001。现在还有一个-0,补码的0是没有正负的,所以+0就是0了,那-0呢?-127的补码是1000 0001,再往下是1000 0000。再来看-128,原码是1 1000 0000(最前面的符号位不再是最高位),符号位不变,其他位取反1 0111 1111,再加1,1 1000 0000,超出8位的最高位1舍弃,剩下1000 0000,所以补码1000 0000可以代表-128。所以最终没有-0,而是-128 ~ 127(共256个数值),对应的补码是1000 0000 到0000 0000再到0111 1111。)

------解决方案--------------------
1、应当从数学层面上去理解:
从数学上计算
      256 - 128 = 128
因为   256 - 128 = 256 + (-128)的补码
而     256 - 128 = 128
所以    256 + (-128)的补码 = 128
所以    (-128)的补码 = 256 - 128
                     = 128
而从数学上, 128 = 1000 0000
故规定-128的补码为 1000 0000
所以说,128在8位内存中是表达不出来的。
不存在+128 8位原码及反码的形式,按常规算法是不对的。
注意:只是规定而已,下面还有原因。

2、
8位二进制 的补码组合序列有
0000 0000 - 0111 1111 0  -  +127
1000 0000                   用来干啥好呢?(表示-0,不是的,-0的原码是1000 0000 补码是
                                          0000 0000  +0 的补码也是 0000 0000
                                        )
1000 0001-  1111 1111 -1 - -127
全部状态为256个
再看看这个规律表
   原码        补码   值
0111 1111   0111 1111 127
0111 1110   0111 1110 126
......补码不断-1........
0000 0000   0000 0000  0
1000 0001   1111 1111 -1
1000 0010   1111 1110 -2
1000 0011   1111 1101 -3
......补码不断-1........
1111 1111   1000 0001 -127
无法表达     1000 0000 -128

于是就有了规定 1000 0000 定为 -128的补码
这种定法和上面数学层面的表述是一致的。
这样规定后,负数的补码在机器中就好算了。
在约定的范围内(-128-+127,对16位32位64位等扩大范围)
先将该负数取绝对值,再用二进制表示出这个绝对值 (不管符号位)
对该二进制数进行取反加一操作就得到负数的补码了
-128 绝对值是 128
128的二进制表示为:
1000 0000
取反
0111 1111
加1
1000 0000
这就是-128的补码
这种办法算出的结果符合“规定值”,规定而已。
------解决方案--------------------
其实根本不用想那么复杂,由于应该是连续的,因此10000000必然是128或-128,如果是128,那么必须对符号位做特别处理,显然不如用-128好
------解决方案--------------------
看看计算机原理之类的书吧,别人说的都是零零碎碎,系统地学习才是正道。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: