反码(1‘s Complement)和补码(2‘s Complement)是两种在二进制形式下表示有符号整数(正数和负数)的方法。这两种方法都允许计算机对正数和负数执行算术运算。
- 反码: 负数是通过对正数的所有位进行取反得到的,但零的双重表示会使算术运算变得复杂。
- 补码: 负数是通过将位取反并加 1 得到的,它只有一个零,且简化了算术运算。
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20250922165109428063/1scomplement.webp">1scomplement
什么是反码(1‘s Complement)?
二进制数的 反码 是通过 翻转所有位 得到的,即将每个 INLINECODE5d87ada7 变为 INLINECODE6e38aa13,每个 INLINECODE4a6eaaff 变为 INLINECODE9eb72006。
Let numbers be stored using 4 bits
1‘s complement of 7 (0111) is 8 (1000)
1‘s complement of 12 (1100) is 3 (0011)
反码的优势
- 通过翻转位很容易计算。
- 适合于具有更简单硬件设计的基本算术运算。
反码的劣势
- 反码有两种零的表示法(0000 和 1111),这可能会导致计算过程中的复杂性。
- 加法运算需要循环进位,这可能会使算术运算变得复杂。
- 与补码相比,在表示负数方面效率较低。
什么是补码(2‘s Complement)?
补码是另一种在现代计算机中广泛使用的二进制数表示技术。要获得一个二进制数的补码,你需要将所有位取反(类似于反码),然后向最低有效位加 1。
在实践中,计算机并不显式计算补码;算术电路利用二进制加法自动处理负数。
二进制数的 补码 是该二进制数的反码加 1。示例:
Let numbers be stored using 4 bits
2‘s complement of 7 (0111) is 9 (1001)
2‘s complement of 12 (1100) is 4 (0100)
补码的优势
- 只有一个零的表示,简化了算术运算。
- 相加数字时不需要循环进位;减法可以通过加上负数来完成。
- 负数的最高有效位为 1,提供了清晰的区分。
补码的劣势
- 具有一个不对称的范围,多出一个负数,但这不影响精度或算术运算。
这些表示法用于有符号数。
反码 和 补码 之间的主要区别在于,反码有两种 0(零)的表示法——00000000,即 正零 (+0),以及 11111111,即 负零 (-0);而在补码中,零只有一种表示法——00000000 (0),因为如果我们给 11111111 (-1) 加 1,我们会得到 100000000,它是九位长的。由于只允许八位,最左边的位被丢弃(或溢出),留下 00000000 (-0),这与正零相同。这就是为什么通常使用补码的原因。
另一个区别是,在使用反码相加数字时,我们首先进行二进制加法,然后加入一个循环进位值。但是,补码只有一个零值,不需要进位值。
> n 位数字的反码范围: -(2n-1-1) 到 (2n-1-1)
>
> n 位数字的补码范围: -(2n-1) 到 (2n-1-1)
反码中有 2n-1 个有效数字,补码中有 2n 个有效数字。
2‘s Complement
—
翻转所有位 + 加 1
只有一个零 (0)
不需要进位
范围: -(2n-1) 到 (2n-1-1)
现代系统的标准