mark一下。
以n位机器码为例。
1. 原码:
有符号整数:[-(2^n-1), 2^n-1];
有符号小数:[-(1-2^(-n)), 1-2^(-n)];
2. 反码的表示范围和原码相同
3. 补码
有符号整数:[-2^n, 2^n-1];
有符号小数:[-1, 1-2^(-n)];
从上我们可以看出,有符号数的补码要比原码和反码多表示出一位来,那么究竟是为什么呢?
补码比原码、反码多出一位的原因:
以8位机器码表示的有符号整数为例,它可以表示的原码和反码范围是[-127, 127],而可以表示的补码范围是[-128, 127]。
原码和反码的±0是不同的表示方法,即:
+0:00000000
-0 :10000000
而反码的±0都是同一个表示方法,同样以8位机器码为例:
±0 :00000000
因此补码中便多出了一个<10000000>,可以用来表示其他的数,此处即可以表示真值为-128。在最位的1,既表示负号、又表示数值位。