1字节的表示范围为-128到127,为什么不是-128到128

如题所述

在计算机中一般来说,一个字节8位,即可表示 2^8=256,有符号数那就是-128到128了,但实际表示的范围是-128到127。

在补码中用(-128)代替了(-0),所以补码的表示范围为: (-128~0~127)共256个.

-1-127的结果应该是-128,在用补码运算的结果中, [1000 0000]补 就是-128。但是注意因为实际上是使用以前的-0的补码来表示-128, 所以-128并没有原码和反码表示。(对-128的补码表示[1000 0000]补算出来的原码是[0000 0000]原, 这是不正确的)

使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制,使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。

扩展资料

原码:

计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

如果用原码表示,让符号位也参与计算, 显然对于减法来说, 结果是不正确的。这也就是为何计算机内部不使用原码表示一个数。

为了解决原码做减法的问题, 出现了反码:

计算十进制的表达式: 1-1=0

1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0

发现用反码计算减法, 结果的真值部分是正确的。而唯一的问题其实就出现在"0"这个特殊的数值上。虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的。而且会有[0000 0000]原和[1000 0000]原两个编码表示0。

于是补码的出现, 解决了0的符号以及两个编码的问题:

1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原

这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了。而且可以用[1000 0000]表示-128:

(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补

参考资料:百度百科 - 二进制补码

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-07-04

因为中间有“0”。

一个字节8位,即可表示 2^8=256,-128到-1是128,0到127是128,加起来是256。如果是-128到128中间包含“0”,-128到-1是128,0到128是129,那就是257了。

一个字节,如果采用原码表示正整数(含0),可以表达0-255,即 2^8=256,一共256种状态,从全0到全1的各种排列组合。

如果要表示负数,则符号位需要占用一位(最高位,1代表负数,0代表正数),因此其绝对值最大范围为0-127,即2^7=128,一共正负各128种状态,如果不采用特殊处理,这时候0占用2个编码(10000000和00000000),数据表示范围为-127到-0及+0到127,这样总体上一个字节只有255种状态,因为其中0具有正0和负0之分,这不符合数学意义也浪费一个编码。

扩展资料

补码的好处:

首先加入没有补码,+0 在计算机中的表示0 000 0000. -0 在计算机中的表示1 000 0000. 并不一致。

如果采用补码-0 的补码就是 0 000 0000. 两者一致

其次我们知道8位二进制的表示形式总共有0000 0000-1111 1111 那么多,恰好是2^8=256.  也就是说理论上可以表示256个十进制数字。我们前面知道,-0 在计算机中如果再用原码 就是1 000 0000 。如果采用反码就是1 111 1111. 会多占用一个表达。

所以如果采用补码就可以把1 000 0000 这个表达空出来表示一个十进制数字。 很显然用它来表示-128 最为合理。

还可以从另外一个角度来理解: -127 的补码是1000 0001.再减去1 就是1000 0000 。那-127-1=-128.

所以补码的好处就是计算机的表达位数可以充分利用表示跟多的十进制数。

本回答被网友采纳
第2个回答  2017-07-17
一个字节8位,如果采用原码表示正整数(含0),可以表达0-255,即 2^8=256,一共256种状态,从全0到全1的各种排列组合。如果要表示负数,则符号位需要占用一位(最高位,1代表负数,0代表正数),因此其绝对值最大范围为0-127,即2^7=128,一共正负各128种状态,如果不采用特殊处理,这时候0占用2个编码(10000000和00000000),数据表示范围为-127到-0及+0到127,这样总体上一个字节只有255种状态,因为其中0具有正0和负0之分,这不符合数学意义也浪费一个编码。
除了以上的弊端,还有个原因是,早期硬件很昂贵,一位或者一个编码的浪费都是不可饶恕的,因此人们想到了另一种编码把负0利用起来,即当遇到负数时,采用补码来表示就可以解决这个问题,而遇到正数或0时还是保留原码表示。因此这个负0通过补码算法处理后自然而然地被利用起来,用来表示-128.
补码的算法为:绝对值的原码各位取反后加1.
例1:负1的补码:
绝对值的8位原码为00000001
取反:11111110
加1 :11111111
此时最高位被处理为1,满足高位为1代表负数的定义。
例2:负128的补码:
绝对值的8位原码为10000000
取反:01111111
加1 :10000000
此时同样的最高位被置为1,同样满足高位为1代表负数的定义,同时原先表示负0的编码被利用起来表示-128。
因此一个字节的有符号整数范围为-128到127,至于-1到-128之间的其他负数你可以用这个算法去验算,建议用windows自带的计算器种的程序员模式去学习和理解。追问

这段话我有点不理解

这里面是定义了五个位段吗?每个位段大小为unsigned int的大小,也就是每个位段都是4字节,32位吗

还是加起来32位

如何判断他把这32位分为几个储存单元

本回答被提问者采纳
第3个回答  2017-07-17
一字节是8Bit,2的8次方,是256个数,-128到127包括0在内就是256个数。
相似回答