在计算机中一般来说,一个字节 8 位,即可表示 2^8=256,有符号数那就是 - 128 到 128 了,但实际表示的范围是 - 128 到 127。
在补码中用 (-128) 代替了 (-0),所以补码的表示范围为: (-1280127) 共 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] 补