Appearance
原码、反码、补码、移码
考情分析
编码转换在 408 真题中几乎每年必考,以选择题和填空题为主,考频极高。常见考查形式:给定真值求补码、由补码还原真值、补码表示范围计算、移码与补码的关系。
四种编码方式
原码
符号位 + 数值位(绝对值的二进制)。
- 正数:符号位为 0,数值位写绝对值
- 负数:符号位为 1,数值位写绝对值
原码有两个零:
反码
- 正数:与原码相同
- 负数:符号位不变,数值位各位取反
反码也有两个零:
补码
- 正数:与原码相同
- 负数:反码 + 1(等价于:符号位不变,从最低位向左找到第一个 1,该位及其右侧不变,左侧数值位取反)
补码只有一个零:
移码
移码 = 补码的符号位取反,专用于表示浮点数的阶码。
移码的特点:移码 0 的表示唯一,真值越大移码对应的无符号整数越大,便于比较大小。
编码对照表(4 位,含符号位)
| 真值 | 原码 | 反码 | 补码 | 移码 |
|---|---|---|---|---|
| +7 | 0111 | 0111 | 0111 | 1111 |
| +6 | 0110 | 0110 | 0110 | 1110 |
| +5 | 0101 | 0101 | 0101 | 1101 |
| +4 | 0100 | 0100 | 0100 | 1100 |
| +3 | 0011 | 0011 | 0011 | 1011 |
| +2 | 0010 | 0010 | 0010 | 1010 |
| +1 | 0001 | 0001 | 0001 | 1001 |
| +0 | 0000 | 0000 | 0000 | 1000 |
| -0 | 1000 | 1111 | — | — |
| -1 | 1001 | 1110 | 1111 | 0111 |
| -2 | 1010 | 1101 | 1110 | 0110 |
| -3 | 1011 | 1100 | 1101 | 0101 |
| -4 | 1100 | 1011 | 1100 | 0100 |
| -5 | 1101 | 1010 | 1011 | 0011 |
| -6 | 1110 | 1001 | 1010 | 0010 |
| -7 | 1111 | 1000 | 1001 | 0001 |
| -8 | — | — | 1000 | 0000 |
数值范围
设机器字长为
| 编码 | 最小值 | 最大值 |
|---|---|---|
| 原码 | ||
| 反码 | ||
| 补码 | ||
| 移码 |
补码比原码/反码多表示一个
转换流程
交互可视化
例题
例1:将 -5 转为 8 位补码
真值
- 原码:
- 反码:
(数值位取反) - 补码:
(反码 + 1)
例2:由补码还原真值
已知 8 位补码
符号位为 1,是负数。对补码(除符号位外)取反加 1:
数值位
验证:
例3:8 位补码的表示范围
原码/反码范围为
快速转换技巧
补码 → 原码(快速法):从最低位向左扫描,找到第一个 1,该位及其右侧保持不变,左侧所有数值位取反。
例:补码
- 从右向左:
之后第一个 1 在第 3 位(从右数,1起始) - 第 3 位及右侧
100不变,左侧数值位10011→ 取反 →01100 - 原码:
10110100,即
这个方法与"取反加 1"等价,但手算更快。
移码判断大小:两个浮点数阶码用移码表示,直接按无符号数比较移码大小即可,无需转换真值。
考点清单
- 正数的原码、反码、补码三者相同
- 原码和反码各有两个零(
和 ),补码只有一个零 位补码能表示 ,而原码和反码不能 - 补码的最小值
对应 ,没有对应的原码/反码 - 移码 = 补码符号位取反,专用于阶码,方便大小比较
- 真值为
时,移码为 (全零),这也是为什么浮点数规格化要求阶码不能全零 - 补码求反(变号):各位取反后 +1(包括符号位),特例:
无对应正数 - 由补码到真值:正数直接读,负数再取一次补码即得原码