一、补码减法的原理
计算机通常利用补码加法实现减法。
核心公式:
计算步骤:
写出被减数和减数的机器码。
对减数的机器码按位取反,末位加1。
将得到的补码与被减数相加。
保留机器字长范围内的结果,最高位向外的进位用于判断标志位。
对于 位机器码:
其中,$\overline{Y}$ 表示对 位机器码逐位取反。
二、CF:进位/借位标志
CF用于判断无符号数运算是否产生进位或借位。
1. 加法的CF
公式:
:最高位向外产生进位,CF=1。
:最高位向外没有进位,CF=0。
例如,4位无符号加法:
1111
+ 0001
------
10000
最高位向外进位为1,因此。
2. 减法的CF
减法通过 实现时:
公式:
:没有借位,CF=0。
:发生借位,CF=1。
也可以直接比较两个无符号操作数:
当 时,$CF=1$。
当 时,$CF=0$。
例如,4位计算:
0011
+ 1001
------
1100
其中 是 取反加1的结果。
最高位向外进位为0,所以:
说明发生借位。
三、OF:溢出标志
OF用于判断有符号数运算是否超出补码表示范围。
位补码表示范围:
例如,4位补码范围为。
1. OF的电路判断公式
公式:
其中:
:符号位向外产生的进位。
:进入符号位的进位。
:异或运算。
因此:
时,$OF=0$。
时,$OF=1$。
记忆:两个进位相同不溢出,不同则溢出。
2. 为什么OF使用异或?
补码的最高位是符号位。
符号位的全加器计算公式:
符号位向外的进位:
其中乘法表示逻辑与,加法表示逻辑或。
当两个正数相加却得到负数,或者两个负数相加却得到正数时,说明发生溢出。
这种情况恰好对应。
因此:
3. OF计算示例
计算4位补码:$7+3=10$。
0111
+ 0011
------
1010
逐位计算:
第0位:$1+1=10$,产生进位1。
第1位:$1+1+1=11$,产生进位1。
第2位:$1+0+1=10$,产生进位1。
第3位:$0+0+1=1$,不产生进位。
因此:
代入公式:
因为,超出了4位补码的最大值,因此发生溢出。
4. OF的符号判断法
加法:
正数 + 正数,结果为负数:OF=1。
负数 + 负数,结果为正数:OF=1。
异号数相加:OF=0。
减法:
正数 − 负数,结果为负数:OF=1。
负数 − 正数,结果为正数:OF=1。
同号数相减:OF=0。
对于减法,还可以使用符号位公式:
其中:
:被减数符号位。
:减数符号位。
:结果符号位。
:逻辑与。
四、CF与OF的区别
注意:CF和OF相互独立,不能通过一个标志位推断另一个。
五、第31题完整解题
已知32位机器字长:
执行减法:$R3=R1-R2$。
第一步:减数取反加1
减数: FFFFFFF0
取反: 0000000F
加1 : 00000010
因此:
第二步:进行补码加法
FFFFFFFF
+ 00000010
----------
10000000F
保留低32位:
第三步:判断CF
最高位向外产生进位:
减法借位标志:
因此 CF=0,没有借位。
第四步:判断OF
进入符号位的进位:
离开符号位的进位:
代入公式:
也可以用十进制验证:
结果没有超出32位补码表示范围,因此没有溢出。
最终答案:A,CF=0,OF=0。
六、考试速记公式
1. 补码减法
2. 加法CF
3. 减法CF
4. 加减法OF
5. OF符号判断(加法)
6. OF符号判断(减法)
七、最终总结
CF:看无符号数
加法:有进位为1。
减法:有借位为1。
补码减法通过加法器实现时,CF等于最高位向外进位取反。
OF:看有符号数
电路法:$OF=C_n\oplus C_{n-1}$。
符号法:加法同号相加结果异号则溢出;减法异号相减结果符号与被减数不同则溢出。
一句话记忆:CF判断无符号进位/借位,OF判断有符号溢出。
注:减法CF采用“CF=1表示借位”的常见约定,不同处理器体系结构可能有所不同。