Appearance
补码加减运算与溢出检测
大纲定位
二(二)2 加/减运算:补码加/减运算器,标志位的生成
要求:会做补码加减、会判溢出(三种方法任一)、会写出 OF/SF/ZF/CF 四个标志的生成式。大纲把"标志位的生成"单列出来,说明它不是附带知识——条件转移指令的判断条件全建立在这四个标志上。
加法器本身的电路结构见 ALU 与加法器。
考情分析
补码加减运算与溢出判断在选择题和大题里都出现过。三种溢出判断方法(单符号位法、双符号位法/变形补码、进位法)都要掌握。
补码加减法规则
补码加法
即两数补码直接相加,符号位参与运算,最高位(符号位)的进位丢弃。
补码减法
减法转化为加法,关键是求
求补操作的快速方法:从最低位开始,找到第一个 1,保持该位及其右侧所有位不变,左侧所有位(包括符号位)取反。
例:
最低位的 1 在第 3 位(从右数),保留右侧 100,左侧 10110 → 01001
溢出的本质
溢出指运算结果超出了机器数所能表示的范围。
对于
- 正溢出(上溢):结果
,两个正数相加但结果变成负数 - 负溢出(下溢):结果
,两个负数相加但结果变成正数
TIP
同符号数相加才可能溢出,异符号数相加不会溢出。
三种溢出判断方法
方法一:单符号位法
观察操作数符号位和结果符号位:
用语言描述:
- 两个正数相加,结果为负 → 正溢出
- 两个负数相加,结果为正 → 负溢出
- 其他情况不溢出
| 溢出判断 | |||
|---|---|---|---|
| 0 | 0 | 0 | 无溢出 |
| 0 | 0 | 1 | 正溢出 |
| 0 | 1 | 0 | 无溢出 |
| 0 | 1 | 1 | 无溢出 |
| 1 | 0 | 0 | 无溢出 |
| 1 | 0 | 1 | 无溢出 |
| 1 | 1 | 0 | 负溢出 |
| 1 | 1 | 1 | 无溢出 |
方法二:双符号位法(变形补码/模 4 补码)
将每个操作数扩展为双符号位:
- 正数:补两个 0,如
→ - 负数:补两个 1,如
→
运算后观察结果的两位符号位:
| 双符号位结果 | 含义 |
|---|---|
00 | 结果为正,无溢出 |
11 | 结果为负,无溢出 |
01 | 正溢出(结果应为正但超出范围) |
10 | 负溢出(结果应为负但超出范围) |
口诀:双符号位相同 → 无溢出;不同 → 溢出(高位符号位是正确符号)。
方法三:进位法
设机器字长
:符号位产生的进位(进位输出) :最高数值位向符号位的进位
→ 溢出 → 无溢出
下标别记反
本站 ALU 与运算部件 一篇用的是同一套约定:
标志位的生成
大纲二(二)2 的原文是「补码加/减运算器,标志位的生成」——运算器和标志位是同一条要求的两半。综合应用题里这部分是按逻辑表达式给分的,光会中文描述不够。
补码加减运算器长什么样
一个
这正是「减法转加法」在电路上的落地——不需要单独的减法器。
四个标志的表达式
设
| 标志 | 表达式 | 对谁有意义 |
|---|---|---|
| ZF(零标志) | 两者都有 | |
| SF(符号标志) | 只对带符号数 | |
| OF(溢出标志) | 只对带符号数 | |
| CF(进位/借位标志) | 只对无符号数 |
CF 这一条最容易写错
减法在硬件上是
合起来就是
| 运算 | 结果 | CF | 含义 | |
|---|---|---|---|---|
50H − 30H | 20H | 1 | 0 | 够减,无借位 |
30H − 50H | E0H | 0 | 1 | 不够减,有借位 |
OF 还有一个等价的符号位形式
除了
读作「两个加数同号,但结果与它们异号」。两式在 8 位下穷举 65536 种组合完全等价。
减法版必须单独推,不能照抄加法版。
读作「
标志位往哪去
四个标志存进标志寄存器 FR,它的输出连到控制器 CU 的输入端——条件转移指令就是靠读这些位决定跳不跳。例如无符号数的「大于」判断用的是
一句话记法
CF 管无符号,OF 管带符号,同一次运算完全可能
交互可视化
典型例题
例题 1:8 位补码,计算
01100100 (+100)
+ 00111000 (+56)
----------
10011100结果符号位为 1,但两个正数相加结果为负 → 正溢出。
双符号位验证(8位字长扩展为9位:2位符号 + 7位数值):
001100100
+ 000111000
----------
010011100双符号位为 01 → 确认正溢出。
例题 2:8 位补码,计算
真值:
10110101 (-75)
+ 11001011 (-53)
----------
1 10000000 进位丢弃结果为 10000000 =
进位法:
例题 3:用双符号位法计算
10111010,双符号位扩展为9位:11011101010110000,双符号位扩展为9位:110110000
110111010
+ 110110000
----------
1 101101010 最高进位丢弃双符号位为 10 → 负溢出(
考点清单
- [ ]
,符号位参与运算 - [ ] 补码减法:
,对 连符号位一起求补 - [ ] 同符号数相加才可能溢出,异符号不溢出
- [ ] 单符号位法:看操作数符号与结果符号
- [ ] 双符号位法:
00/11无溢出,01正溢出,10负溢出 - [ ] 进位法:
- [ ] 快速求补:找最低位 1,左侧全部取反(含符号位)