Skip to main content

number encoding

原码 反码 补码

数字是以“补码”的形式存储在计算机中的

  • 原码:我们将数字的二进制表示的最高位视为符号位,其中0表示正数,1表示负数,其余位表示数字的值。
  • 反码:正数的反码与其原码相同,负数的反码是对其原码除符号位外的所有位取反。
  • 补码:正数的补码与其原码相同,负数的补码是在其反码的基础上加1。

取反+1

方向 A:原码 → 补码

原码 (-5):1000 0101
取反(除符号位):1111 1010
加一:1111 1011 (这就是 补码)

方向 B:补码 → 原码

补码 (-5):1111 1011
取反(除符号位):1000 0100
加一:1000 0101 (这就是 原码)

原码最直观,但是负数的原码不能直接运算:
1+(-2)= 0000 0001 + 1000 0010 = 1000 0011 = -3

反码可以计算,先将数字转换为反码,计算完之后再转换为原码得到正确答案:
1+(-2)= 0000 0001 + 1000 0010(原码) = 0000 0001+ 1111 1101(反码) = 1111 1110(反码)= 1000 0001(原码) = -1

反码还存在 +0(0000 0000) -0(1000 0000) 歧义,补码解决了该问题:
(-0) 1000 0000 = 反码+1 = 1111 1111 + 0000 0001 = 1 0000 0000 (byte 8 位 舍弃高位1) = 0000 0000 = 0

补码1000 0000(-0) 不存在原码,所以在计算机中规定为 -128

  • (+127) 0111 1111
  • (-127) 1000 0001
  • (-128) 1000 0000

byte的范围就是(-128) - (+127)