在计算机科学和数字电路中,"补码" (Complement Code) 是一种表示有符号整数(正数和负数)的方法。它解决了早期表示方法(如原码、反码)在算术运算上的一些复杂性和问题。

我们通常说的“1补码”和“2补码”实际上是指 “反码 (One's Complement)”“补码 (Two's Complement)”


1. 原码 (Sign-Magnitude Representation)

在介绍反码和补码之前,先简单说一下原码。
原码: 用最高位表示符号(0代表正数,1代表负数),其余位表示数值的绝对值。


2. 反码 (One's Complement) - "1补码"

定义:

特点:

为什么叫 "One's Complement" (反码)?
因为一个数的反码加上它本身,所有位都变成1(假设不考虑符号位)。例如,0101 (+5)1010 (-5的反码)0101 + 1010 = 1111。在数学上,这可以理解为对 2^n - 1 的“补足”,即 X + X' = 2^n - 1


3. 补码 (Two's Complement) - "2补码"

定义:

核心优势:

  1. 唯一的零: 只有 0000 表示 0。这解决了原码和反码的双零问题。
  2. 统一的加减法: 所有的加减运算都可以通过加法来完成,无需额外处理符号位。
    • A - B 等同于 A + (-B的补码)
    • 例如,5 - 3 (4位):
      • +5 的补码是 0101
      • +3 的补码是 0011
      • -3 的补码是:0011 (原码) -> 1100 (反码) -> 1101 (补码)
      • 0101 + 1101 = 10010。在 4 位系统中,最高位的进位 1 被舍弃,结果是 0010,即 +2,正确!
  3. 表示范围不对称: 对于 n 位二进制数,补码可以表示 -(2^(n-1))(2^(n-1) - 1) 的范围。例如,4 位可以表示 -8+7。这是因为少了一个 0 的表示,所以负数可以多表示一个。

为什么叫 "Two's Complement" (补码)?
这是因为一个负数的补码加上它本身,结果是 2^n(在模 2^n 意义下为 0),这在数学上被称为对 2^n 的“补足”。

这种“补足”的概念使得处理器在进行加减法时,无论数字是正数还是负数,都只进行简单的二进制加法,最高位溢出就舍弃,从而大大简化了硬件设计。这是现代计算机普遍采用补码表示有符号整数的原因。

理解这些概念的关键在于 模运算 (Modulo Arithmetic)

核心概念:模运算 (Modulo Arithmetic)

在计算机中,我们使用的二进制数是固定位数的。这意味着无论运算结果多大,它都会“环绕”在一个特定的范围内。这就好比一个时钟:12点 + 3小时 = 3点,而不是15点。这里的“12”就是模数。

对于一个 N 位的二进制系统:

1. 反码 (One's Complement) 的数学原理

2. 补码 (Two's Complement) 的数学原理

总结