在做位运算实现函数功能的相关题目时,我遇到了一个很重要的问题,两个有符号整数做加/减法时,用来判断是否溢出的OF位该如何判断?
最后整理出3个方法,整理并分享出来,希望对您有帮助。
1.根据计算机组成原理课上学习的知识
OF = Cn ⊕ Cn-1
注意这里的Cn和Cn-1并不是指x+y或x-y结果补码的最高有效位的左边的进位以及最高有效位的数值,而是指x+y或x-y结果补码的最高有效位以及次高有效位的进位情况,若有进位,该值为1,否则为0。
下面以8位机器数(首位为符号位)为例简单说明
1 0 0 0 0 0 0 1
+ 1 0 0 0 0 0 0 0
--------------------
1 0 0 0 0 0 0 0 1
两数相加的补码运算如上,[x]补 + [y]补 = [x + y]补
在结果中,最高有效位进行的运算是1 + 1有进位,因此Cn = 1;次高有效位进行的运算是0 + 0没有进位,因此Cn-1 = 0。
1 ⊕ 0 = 1,即OF = 1,发生溢出。
OF = A7 ⊕ B7 ⊕ C7 ⊕ C8
以8位数运算举例:
8位二进制数A:A7 A6 A5 A4 A3 A2 A1 A0
8位二进制数B:B7 B6 B5 B4 B3 B2 B1 B0
A +/- B 的结果9位二进制数C:
C8 C7 C6 C5 C4 C3 C2 C1 C0