2010年第13题
假定有 4 个整数用 8 位补码分别表示 r1=FEH,r2=F2H,r3=90H,r4=F8H,若将运算结果存放在一个 8 位寄存器中,则下列运算中会发生溢出的是( )
A. r1×r2 \qquad B. r2×r3 \qquad C. r1×r4 \qquad D. r2×r4
解析
本题考查了补码和溢出的有关知识:
-
补码:是计算机中表示有符号整数的标准方法。8 位补码的最高位(MSB)为符号位:0 表示正数,1 表示负数。正数的补码是其二进制本身;负数的补码是其绝对值的二进制取反(按位取反)后加 1。8 位补码的范围是 -128(10000000)到 127(01111111)。转换十六进制补码到十进制时,需根据符号位判断正负。若符号位为 1,需取反加一得到绝对值,再添加负号。
-
溢出:在算术运算中,当结果超出数据类型能表示的范围时发生溢出。对于 8 位补码乘法,溢出发生在结果 < -128 或 > 127。溢出时,结果无法正确存储在 8位寄存器中,会导致精度损失或错误。乘法溢出的检测依赖于数值计算。两个 n 位补码数相乘,结果可能需要最多 2n 位表示。若真实结果超出 n 位范围,则溢出。
-
补码乘法溢出检测:补码乘法运算的溢出不能仅通过符号位简单判断,需计算真实结果并与范围比较。硬件中可能通过检查高位位是否全为符号位来检测,但本题可直接计算数值验证。本题中,所有运算均为负数相乘(负负得正),因此结果为正数。溢出风险主要来自乘积的绝对值过大(>127)。
题目已知整数的补码,首先将十六进制的补码转换为十进制的整数(即真值)。对每个补码的转换过程如下表所示:
变量 | 补码(16) | 补码(2) | 符号位 | 补码取反 → \to →加 1后的值→十进制 | 真值(含符号位) |
---|---|---|---|---|---|
r1 | FEH | 1111 1110 | 1 | 0000 0001 → \to → 0000 0010→2 | -2 |
r2 | F2H | 1111 0010 | 1 | 0000 1101$\to$0000 1110→14 | -14 |
r3 | 90H | 1001 0000 | 1 | 0110 1111$\to$0111 0000→112 | -112 |
r4 | F8H | 1111 1000 | 1 | 0000 0111$\to$0000 1000→8 | -8 |
然后按照十进制的真值,分别计算各选项的乘法结果,结果不应超过 8 位补码范围 -128 到 127,超过了则溢出。
- A. r1 × r2 = (-2) × (-14) = 28
- B. r2 × r3 = (-14) × (-112) = 1568
- C. r1 × r4 = (-2) × (-8) = 16
- D. r2 × r4 = (-14) × (-8) = 112
很显然,选项 B 的计算结果超过了 127,即其结果溢出。
本题答案:B