Appearance
题目
若 x=103,y=-25,则下列表达式采用 8 位定点补码运算实现时,会发生溢出的是( )。
错因
A
把"两个数运算"和"溢出"直接挂钩,没看符号。,一正一负相加,结果绝对值变小,绝对不会溢出(异号相加的结果一定夹在两个加数之间)。
B
,恰好等于 8 位补码下界。误以为"碰到 −128 就是溢出"。实际上 8 位补码可表示的范围是 , 是合法值(机器码 10000000),不算溢出。
D
,结果在 内,没有溢出。可能因为看到"两个负号"心理上觉得"算大值"而误判;其实 ,整体是异号相加,结果反而变小。
总解析
8 位补码可表示的整数范围:
只要运算结果落在此区间内,就没溢出;超过 或低于 才算溢出。异号相加(同号相减)一定不溢出——结果落在两数之间;同号相加(异号相减)才有可能溢出。
逐项算真值并判定:
| 选项 | 表达式 | 数学结果 | 在 内? | 溢出? |
|---|---|---|---|---|
| A | ✓ | 否 | ||
| B | ✓(恰为下界) | 否 | ||
| C | ✗(128 > 127) | 是 | ||
| D | ✓ | 否 |
C 项验证:,超过最大正数 。
机器执行 x - y 等价于 x + (-y) = 103 + 25:两个正数同号相加得 ,超出可表示范围 → 正溢出。
最终答案是 C(x-y)。
判定口诀:
- 同号相加 / 异号相减:可能溢出,要算
- 异号相加 / 同号相减:永不溢出,可直接排除
- 边界值 是合法值,不算溢出(容易在 B 这种题面栽跟头)