首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-01-28 
对于8位类型,为什么表示为-128~127?我google了一翻,胡乱理解如下。请大家说说自己的想法,谢谢。对于一种8 bi

对于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好
[解决办法]
看看计算机原理之类的书吧,别人说的都是零零碎碎,系统地学习才是正道。


[解决办法]
有符号数的范围:-2^n~2^n-1,按别人的规定办事,不用钻牛角脚尖。可以结贴给分了
[解决办法]
太深入反而不好 , 应多着重于实际开发层面, 能力很重要。
[解决办法]
刚开始学的时候我也纠结过呢
[解决办法]
看看操作系统
[解决办法]
作为一个初学者还是应该细究一下的,这也算是基本功吧。当然这仅仅是在学生时代可以,在实际开发过程中重点就是业务与项目能力了,就没时间给你来细究这些了,所以LZ该细究时就细究

热点排行