目录
- 原码
- 反码
- 补码
- -128的由来
原码
原码是指一个二进制数左边加上符号位后所得到的码,且当二进制数大于0时,符号位为0;二进制数小于0时,符号位为1;二进制数等于0时,符号位可以为0或1(+0/-0)。8位 有符号数 范围是-127 ~ 127 , 8位 无符号数 范围是 0 ~ 255 。
原码的优点是简单直观,缺点是不能直接参与计算。例如,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2,显然不对。
反码
反码表示法是一种在计算机中用机器码表示有符号数的方式之一。正数的反码就是它的原码;负数的反码就是原码符号位除外,其他位按位取反。
比如用反码计算 1 + (-1):
(+1) + (-1) = 0000 0001(反码) + 1111 1110(反码) = 1111 1111(反码) = (-0)
0 的原码是 0000 0000 或 1000 0000,0 的反码就是 0000 0000 或 1111 1111。即在反码中,1111 1111 象征 -0。
补码
正数的补码是它的原码,负数的补码是在它的反码基础上加 1。因此,在8位的补码系统中,可以表示的最大正数为 127 ,可以表示最小的负数为 -128 。
由于 +1 的操作,必将出现进位,如果进位超过长度限制,最高位就会丢失。-0 的反码表示 1111 1111,它的补码为 1 0000 0000。由于长度是 8 位,最高位的 1 已经溢出,所以丢弃,-0 的补码就成了 0000 0000,和刚才我们所提到的 +0 一致。
比如用补码来计算 (+1) + (-1):
(+1) + (-1) = 0000 0001(补码) + 1111 1111(补码) = 0000 0000(补码) = (0)
因此,计算机内部使用补码方式表示负数,因为它让「正数 + 负数」也能使用同一套规则。
-128 的由来
如果用补码的方式进行表示,-0 就不存在了,为了让有限的位数尽可能表示更多的数,那么 1000 0000 就可以用来表示 -128 了。
让我们用补码来计算一下 (-1) + (-127):
(-1) + (-127) = 1000 0001(原码)+ 1111 1111(原码)= 1111 1110(反码)+ 1000 0000(反码)
(-1) + (-127) = 1111 1111(补码)+ 1000 0001(补码) = 1 1000 0000(补码)
1 1000 0000(补码)丢弃最高位,即为 1000 0000 = (-128)