Appearance
题目
假定有 4 个整数用 8 位补码分别表示 r1=FEH,r2=F2H,r3=90H,r4=F8H,若将运算结果存放在一个 8 位寄存器中,则下列运算中会发生溢出的是( )。
错因
A
可能误把 r1=FEH 当成无符号数 254、r2=F2H 当成 242,于是 254 × 242 远超 8 位无符号最大值 255,认为溢出。但题目明说是"8 位补码",FEH/F2H 是补码表示的负数(-2 / -14),它们的乘积只有 28,完全在 8 位补码范围内。关键错点:把"补码"当"无符号"读了。
C
可能逐位心算时把 r1=FEH 错成 -16 之类的数(看到末位 E 联想成 14 或更大);或者用错了"取反加一"的方向,把负数的真值估错。实际 r1 = ……不对——补码求真值的捷径:FEH = 1111 1110₂,最高位 1 表示负,按位取反加 1 得 0000 0010 = 2,所以真值 = -2。r1 × r4 = (-2) × (-8) = 16,不溢出。
D
容易把这一对误判成溢出——因为 r2、r4 看起来都是较大的"H 字头"数。但 r2 = F2H = -14、r4 = F8H = -8,乘积 = 112 = 70H,恰好在 8 位补码上界 +127 之内(边界值!)。心算时若高估了任一因子的绝对值(比如把 F2H 估成 -50 量级),就会得出 800+ 之类的结论。
总解析
第一步:把 4 个 8 位补码还原成真值
| 补码(H) | 二进制 | 求真值(最高位 1 → 取反加 1 得绝对值) | 真值 |
|---|---|---|---|
| r1 = FEH | 1111 1110 | −2 | |
| r2 = F2H | 1111 0010 | −14 | |
| r3 = 90H | 1001 0000 | −112 | |
| r4 = F8H | 1111 1000 | −8 |
第二步:算各乘积,对照 8 位补码表示范围
| 选项 | 真值乘积 | 是否在 |
|---|---|---|
| A. r1 × r2 | (−2) × (−14) = 28 | ✓ 不溢出 |
| B. r2 × r3 | (−14) × (−112) = 1568 | ✗ 远超 +127,溢出 |
| C. r1 × r4 | (−2) × (−8) = 16 | ✓ 不溢出 |
| D. r2 × r4 | (−14) × (−8) = 112 | ✓ 不溢出(贴近上界 +127) |
第三步:得出答案
只有 B 的乘积 1568 超出 8 位寄存器能表示的范围,必然溢出。
最终答案是 B(r2 × r3)。
判定要点:
- 8 位补码的真值范围是 ,记牢这个边界
- 求负数补码真值的捷径:最高位是 1就按位取反加 1 得到绝对值
- 乘法溢出判断直接看真值乘积是否超界,不用先做补码乘法再判