Skip to main content

原码和补码

(1)原码

用最高位作为符号位来表示数的符号:为 0 表示正数;为 1 表示负数,其余各位表示数值本身的绝对值(以二进制表示)。

例如:

  • +10 的原码是: 0000 0000 0000 1010 (最高位 0 代表正)
  • -10 的原码是: 1000 0000 0000 1010 (最高位 1 代表负)
  • +0 的原码是: 0000 0000 0000 0000
  • -0 的原码是: 1000 0000 0000 0000

注意: +0 和 -0 表示的是同一个数 0,而在内存中却有两个不同的表示。由于 0 的表示不唯一,不适合计算机的运算,所以在计算机内部一般不使用原码来表示数。


(2)反码

  • 正数: 正数的反码与原码相同。如 +10 的反码也是 0000 0000 0000 1010
  • 负数: 负数的反码是:原码符号位仍为 1,其他各位取反。如 -10 的反码为 1111 1111 1111 0101

关于 0 的表示:

  • +0 的反码是: 0000 0000 0000 0000
  • -0 的反码是: 1111 1111 1111 1111

同样,0 的表示不唯一。所以,在计算机内部一般也不使用反码来表示数。


(3)补码

  • 正数: 正数的补码与原码相同。如 +10 的补码同样是 0000 0000 0000 1010
  • 负数: 负数的补码是:除最高位仍为 1 外,原码的其余各位求反,最后再加 1。或者说,负数的补码是其反码加 1

例如,-10 的补码计算过程:

  1. 原码: 1000 0000 0000 1010
  2. 求反(除最高位外): 1111 1111 1111 0101
  3. 再加 1,结果为: 1111 1111 1111 0110

关于 0 的表示(补码的唯一性):

  • +0 的补码是: 0000 0000 0000 0000

  • -0 的补码计算:

    Plaintext

      1111 1111 1111 1111 (反码)
    + 1
    ---------------------
    1 0000 0000 0000 0000 (1 溢出)

    剩下: 0000 0000 0000 0000

结论: 用补码形式表示数值 0 时,是唯一的,都是 0000 0000 0000 0000

总结

计算机通常都是以补码形式存放数值。因为采用补码形式不仅数值表示唯一,而且能将符号位与其他位统一处理。实际上采用补码,在计算机中也可以使减法变为加法,为硬件实现减法提供方便。