loong博客

原码、反码与补码

目录

  • 原码
  • 反码
  • 补码
  • -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)