原码、反码与补码详解

360影视 欧美动漫 2025-09-10 17:04 3

摘要:在计算机中,数值的存储和运算依赖于 二进制编码。对于 有符号整数,常用的编码方式包括 原码(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"。

- 反码:改进运算但仍需处理进位。

- 补码:现代计算机标准,统一加减法,硬件实现高效。

掌握补码是理解 计算机算术 和 底层优化 的关键!

来源:胥胥看球坛

相关推荐