补码的设计十分巧妙,它优雅地解决了 -0 与 0 相等的问题。下面通过 8 位二进制来说明这一过程。

原码表示

在原码中,最高位为符号位,0 表示正数,1 表示负数:

  • 0 的原码:00000000
  • -0 的原码:10000000

可以看到,原码下 0 和 -0 的二进制表示是不同的,这就造成了"同一个数有两种编码"的问题。

反码表示

反码的规则是:正数不变,负数将符号位以外的所有位取反。

  • -0 的反码:11111111

反码同样没能解决这个问题,-0 和 0 的编码仍然不同。

补码表示

补码在反码的基础上再加 1:

  • -0 的补码:原码取反 + 1 = 00000000

由于 8 位溢出,最终结果恰好是 00000000,与正 0 的补码完全一致。因此在补码体系下,内存中实际存储的内容都是 00000000,-0 和 0 被统一为同一种表示。

-1 的实际存储