补码的设计十分巧妙,它优雅地解决了 -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 被统一为同一种表示。