摘要:在计算机中,数值的存储和运算依赖于 二进制编码。对于 有符号整数,常用的编码方式包括 原码(Sign-Magnitude)、反码(Ones' Complement) 和 补码(Two's Complement)。以下是它们的定义、转换规则及实际应用。
原码、反码与补码详解
在计算机中,数值的存储和运算依赖于 二进制编码。对于 有符号整数,常用的编码方式包括 原码(Sign-Magnitude)、反码(Ones' Complement) 和 补码(Two's Complement)。以下是它们的定义、转换规则及实际应用。
***
1. 原码(Sign-Magnitude)
(1) 定义
- 最高位为符号位:"0" 表示正数,"1" 表示负数。
- 其余位表示数值的绝对值。
- 示例(8位):
- "+5":"00000101"
- "-5":"10000101"
(2) 特点
- 直观:符号和数值分离,便于人类理解。
- 问题:
- 存在 "+0" 和 "-0":"00000000" 和 "10000000"。
- 加减运算复杂:需单独处理符号位。
(3) 范围
- n 位原码:"-(2^(n-1)-1) ~ +(2^(n-1)-1)"(如 8 位:"-127 ~ +127")。
***
2. 反码(Ones' Complement)
(1) 定义
- 正数:与原码相同。
- 负数:符号位为 "1",数值位按位取反。
- 示例(8位):
- "+5":"00000101"(同原码)
- "-5":"11111010"(原码 "10000101" 的数值位取反)
(2) 特点
- 解决加减法问题:通过取反简化运算。
- 仍存在 "+0" 和 "-0":
- "+0":"00000000"
- "-0":"11111111"
- 运算规则:加法需处理进位(如 "-5 + 3" 需额外加 "1")。
(3) 范围
- n 位反码:"-(2^(n-1)-1) ~ +(2^(n-1)-1)"(同原码)。
***
3. 补码(Two's Complement)
(1) 定义
- 正数:与原码相同。
- 负数:反码 + 1(符号位为 "1",数值位取反后加 "1")。
- 示例(8位):
- "+5":"00000101"
- "-5":
1. 原码:"10000101"
2. 反码:"11111010"
3. 补码:"11111011"(反码 + 1)
(2) 特点
- 解决 "+0" 和 "-0" 问题:"0" 唯一表示为 "00000000"。
- 简化硬件设计:
- 加减法统一用加法电路实现("A - B = A + (-B)")。
- 乘法/除法可直接复用无符号数的逻辑。
- 现代计算机标准:所有主流 CPU 均使用补码。
(3) 范围
- n 位补码:"-2^(n-1) ~ +(2^(n-1)-1)"(如 8 位:"-128 ~ +127")。
- 特殊值:"10000000" 表示 "-128"(无对应正数)。
***
4. 转换规则总结
| 编码类型 | 正数表示 | 负数表示步骤 |
||||
| 原码 | 直接二进制 | 符号位 "1" + 绝对值二进制 |
| 反码 | 同原码 | 符号位 "1" + 数值位取反 |
| 补码 | 同原码 | 符号位 "1" + 数值位取反 + 1 |
***
5. 实际应用示例
(1) 补码的加减法
; 计算 8 - 5(补码实现)
mov al, 8 ; AL = 00001000 (+8)
mov bl, -5 ; BL = 11111011 (-5 的补码)
add al, bl ; AL = 00000011 (+3), OF=0
(2) 补码转真值
- 若补码为 "11111011"("-5"):
1. 取反:"00000100"
2. 加 "1":"00000101"("+5")
3. 加符号:"-5"
***
6. 为什么补码成为标准?
1. 唯一表示 "0":避免 "+0" 和 "-0" 的歧义。
2. 硬件简化:
- 减法变加法("A - B = A + (-B)")。
- 乘法/除法电路复用无符号数逻辑。
3. 范围更广:比原码/反码多表示一个负数(如 8 位补码可表示 "-128")。
***
7. 常见问题
Q1:补码 "10000000" 表示什么?
- 8 位补码:"10000000" 表示 "-128"(无对应的原码/反码形式)。
Q2:如何快速求补码?
- 从右向左:找到第一个 "1",保留该 "1" 及其右侧所有位,左侧取反。
- 示例:"01011000" → "10101000"("-88")。
Q3:补码的溢出判断?
- OF 标志:若 "正 + 正 = 负" 或 "负 + 负 = 正",则 "OF=1"。
***
8. 总结
- 原码:直观但运算复杂,存在 "±0"。
- 反码:改进运算但仍需处理进位。
- 补码:现代计算机标准,统一加减法,硬件实现高效。
掌握补码是理解 计算机算术 和 底层优化 的关键!
来源:胥胥看球坛