需要注意的是,对于标题中提到的判定原理指的是为什么OF与CF会用到异或这一逻辑运算来判定是否溢出的。
对于OF:
我们首先需要清楚的是溢出的含义是什么:溢出指的是有符号数的计算结果的绝对值(即不包含符号位)在计算机中存不下了。如在4位寄存器中,计算结果超出了(-8)~(7)了,从而造成溢出,OF=1。
知道了溢出是超出寄存器能表示的范围这一含义后,接着也需要清楚的是,容易造成溢出的情况有哪些?
1.两符号数异号,那么异号的情况下二者之和只会比原本的二者更小,所以不会造成溢出。
2.两符号数同号,在该条件下,可能会造成二者之和会比原本的二者更大,可能造成溢出,或者可能计算结果与原二者异号从而造成溢出。
对于同号:
A.两者同正,即最高位的符号位均为0,所以在计算结果的最高位的符号位也为0,即最高位的进位为0,但是如果次高位,进位了一个1,这就造成了原本该为0的最高位因为次高位的进位而变成了1,即两个正数相加却得到了一个负数,换一种说法就是原本数值位的数因为相加进位而影响了符号位。但是这种情况加法器是识别不出来的,所以就引用了OF将次高位与最高位相异或就能识别出这种情况。
如二者同正情况下,计算结果最高位进位已经为0,接下来只需要判断次高位是否有进位,有进位就是溢出的情况,因为有进位则为1,与最高位进位异或OF=1。
B.两者同负同理,那么最高位进位即为1,如果次高位中没有进位那么就会造成次高位进位为0,相异或的结果为OF=1,溢出。
总而言之,在有符号数中相加(相减可以转换成相加),计算结果的最高位可能会因为次高位的进位而造成与原二加数符号相异(同正相加得负数,同负相加得正数),从而造成溢出,所以就需要最高位的进位与次高位的进位相异或来判定。
对于CF:
只要超过了寄存器所能表示的数值范围CF=1。
由于没有正负,只有加减。
对于加法(减法转换成加法),即Cin=0,如果最高位发生了进位(即超过最大数值范围),对于最高位的进位=1,相异或则CF=1。