在计算机中,一个字节8位,可以表示2^8=256没有符号数那就是-128~+128,但实际上范围却是-128到127,这是为什么?这就是计算机和人类思维的差异。
原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。比如如果是8位二进制
[+1]原 = 0000 0001
[ -1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
反码
正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
[+1] = [00000001]原 = [00000001]反
[ -1] = [10000001]原 = [11111110]反
补码
正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变, 其余各位取反, 最后+1。(即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[ -1] = [10000001]原 = [11111110]反 = [11111111]补
计算机中的运算
对于计算机, 加减乘数已经是最基础的运算,要设计的尽量简单。计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法。我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了。 用原码、反码计算都存在一定的问题,补码计算却完全没有问题,还可以多出一个数[1000 0000]用来表示-128。
转换计算
负数:补码=反码+1;反码=原码的真值部分取反;
原码=补码真值部分取反+1=(补码-1)真值部分取反;