Appearance
题目
假设 8 位字长的计算机中,两个带符号整数 x 和 y 的补码表示分别为 x 补 = A3H,y 补 = 75H,则通过补码加减运算器得到的 x-y 的值及 OF 标志分别为( )。
错因
A
两个错叠加。其一,把结果当成十六进制 24H = 36 而不是十进制 46(或者干脆把 8 位结果当 BCD/十六进制看);其二,看到"减法没产生借位"就当作"未溢出",OF=0。本题的真实结果按二进制读是 0010 1110 = 46,不是 24;判溢出的也不是借位/进位本身,而是符号变化。
B
结果数算错(同 A 选 24),但溢出判断对——两个负数相加得正,确实溢出 OF=1。错的根源还是把二进制结果按错误进制读出(0010 1110 看成"24"),把"OF=1 那一项"配错了数字。这是个组合干扰项,迷惑选 A 的人多走半步。
C
结果数算对了(46),但 OF 判错为 0。常见思路:看到加法运算 A3H + 8BH = 1 0010 1110 时,认为"反正最高位的进位舍弃了,没出错",把"舍弃的进位"误当作"没溢出"。补码溢出不能用进位本身判——必须用"两加数符号 vs 结果符号"或双符号位法。本题两负相加得正,已经溢出,OF 必须是 1。
总解析
思路:8 位补码减法走的是 的等价加法。
- 求 (对 "取反加 1",即按位取反末位 +1)
- 与 做 8 位加法、舍去最高进位
- 把结果按 8 位补码读出十进制
- 判 OF:两加数同号、结果异号 → 溢出
第一步:求
对它"取反加 1"得到 :
| 步骤 | 二进制 | 十六进制 |
|---|---|---|
| 75H | ||
| 各位取反 | 8AH | |
| +1 | 8BH |
所以 。
第二步:补码加法
1010 0011 (A3H, 负数, 符号位 1)
+ 1000 1011 (8BH, 负数, 符号位 1)
-----------
1 0010 1110 (9 位结果)
↑
舍弃最高进位舍弃溢出进位后留下 8 位:
注意:结果的二进制 0010 1110 应直接读成十进制 46,而不是误读成"24H = 36"。
第三步:判 OF(两个不同的等价方法)
方法一(符号变化法,最常用):两个加数都是负(符号位 1 + 符号位 1),相加结果符号位变成正(0010 1110 → 0),符号反转 → 溢出。
方法二(双符号位法):把每个数的符号位再复制一份得到 9 位双符号位补码:
| 项 | 双符号位补码 |
|---|---|
| 相加 | |
| 舍最高进位后 |
双符号位 = 10(最高 0、次高 1,不一致)→ 溢出,OF = 1。
也可以从语义上验证:(A3H 是 ),,,已经超出 8 位有符号范围 ,必然溢出。
第四步:拼答案
- (按 8 位补码,丢掉了高位) = 46
- OF = 1
最终答案是 D(46, 1)。
补码加减溢出判定速查:
| 方法 | 判据 | 适用 |
|---|---|---|
| 符号变化 | 同号相加得异号 → 溢出 | 一位符号位 |
| 双符号位 | 双符号位 01 或 10 → 溢出 | 改造的运算器 |
| 进位异或 | 最高位进位 ⊕ 次高位进位 = 1 → 溢出 | 硬件实现 |
| 数值范围 | 结果超出 → 溢出 | 事后验证 |
编者注(生僻术语):OF(Overflow Flag)是 CPU 标志寄存器里的"溢出标志位",由有符号运算的"两加数同号、结果异号"或"双符号位不一致"自动置位,与无符号溢出的 CF(进位标志)不是一回事——本题陷阱就在 A3H + 8BH 的最高位进位被舍弃,CF=1 但这不直接等于 OF=1,要单独判。