在计算机中,有符号整数的表示方法主要有 原码、反码和补码,它们解决了二进制数表示正负数及简化运算的问题。以下是分步说明:
1. 原码(Sign-Magnitude)
- 定义:最高位为符号位(0正1负),其余位表示数值的绝对值。
- 示例(4位二进制):
+5
→0 101
-5
→1 101
- 问题:
- 零的歧义:存在
+0
(0 000
)和-0
(1 000
)。 - 运算复杂:加减法需判断符号,硬件实现困难。
- 零的歧义:存在
2. 反码(1’s Complement)
- 定义:正数与原码相同;负数为原码符号位不变,其余位取反。
- 示例:
+5
→0 101
-5
→1 010
(原码1 101
取反)
- 运算:
- 加法:
5 + (-5)
→0 101 + 1 010 = 1 111
(反码的-0
)
- 加法:
- 问题:
- 双零问题:仍存在
+0
(0 000
)和-0
(1 111
)。 - 进位处理:运算结果若溢出需循环进位。
- 双零问题:仍存在
3. 补码(2’s Complement)(现代计算机标准)
- 定义:正数与原码相同;负数为反码加1。
- 示例:
+5
→0 101
-5
→1 011
(反码1 010
+ 1)
- 运算:
- 加法:
5 + (-5)
→0 101 + 1 011 = 10 000
(溢出后为0 000
)
- 加法:
- 优势:
- 唯一零:
0
仅表示为0 000
。 - 统一运算:减法可转换为加法(
A - B = A + (-B)
)。 - 范围更大:n位补码范围为 -2ⁿ⁻¹ 至 2ⁿ⁻¹ -1(如8位:-128 ~ 127)。
- 唯一零:
4. 转换步骤
负数转补码:
- 取绝对值原码:如
-5
→ 绝对值原码0 101
。 - 符号位置1 →
1 101
(原码)。 - 数值位取反 →
1 010
(反码)。 - 加1 →
1 011
(补码)。
补码转十进制:
- 符号位为1:表示负数。
- 数值位取反加1:
1 011
→ 取反1 100
→ 加11 101
→ 绝对值5 → 结果-5。
5. 关键对比
表示法 | 优点 | 缺点 | 零的表示 |
---|---|---|---|
原码 | 直观易读 | 双零问题,运算复杂 | +0 和 -0 |
反码 | 解决部分运算问题 | 双零仍存在,需循环进位 | +0 和 -0 |
补码 | 运算统一,无双零,范围更大 | 负数转换需额外步骤 | 唯一 0 |
6. 实际应用
- 硬件简化:CPU只需加法器即可处理所有有符号数运算。
- 编程注意:
- 溢出检测:如
127 + 1
(8位补码)会溢出为-128
。 - 位移操作:右移补符号位(算术右移)或补零(逻辑右移)。
- 溢出检测:如
总结
- 补码 是计算机表示有符号整数的标准方法,解决了原码和反码的缺陷。
- 理解补码有助于调试底层代码、处理溢出及优化位运算。