補(bǔ)碼運(yùn)算溢出檢測(cè)及解決方法
補(bǔ)碼運(yùn)算的基本公式如下:

當(dāng)進(jìn)行補(bǔ)碼運(yùn)算的時(shí)候,不可避免會(huì)產(chǎn)生溢出問題:


上圖中,+89和+108的符號(hào)位都是0,最高數(shù)值位都是1,最高數(shù)值位產(chǎn)生進(jìn)位,前者則沒有,結(jié)果產(chǎn)生溢出。
再看小數(shù)補(bǔ)碼的定義:


上圖中的最高溢出位1去除不要。

上圖則是產(chǎn)生了溢出的情況。兩個(gè)小數(shù)之和如果超過1,則肯定產(chǎn)生溢出;兩個(gè)整數(shù)之和如果超過了最大位數(shù)(比如兩位十進(jìn)制能表示的最大數(shù)字是99)則產(chǎn)生溢出,上圖中A-B的結(jié)果是-138,138超過了7位二進(jìn)制能表示的最大數(shù)字127,因此產(chǎn)生了溢出。
對(duì)于小數(shù)溢出的檢測(cè),通常采用如下雙符號(hào)位:

假設(shè)x=-0.110,y=-0.101 兩個(gè)負(fù)數(shù)的絕對(duì)值都大于0.5,結(jié)果應(yīng)該溢出:

取雙符號(hào)位, 最后答案: 10 .101 有溢出
再考慮x=-0.010,y=-0.101 兩個(gè)負(fù)數(shù)的絕對(duì)值沒有同時(shí)大于0.5,結(jié)果應(yīng)該無溢出:

最后答案: 11 .101 無溢出
由以上例子可以看出,當(dāng)兩個(gè)負(fù)數(shù)的絕對(duì)值都大于0.5的時(shí)候,其補(bǔ)碼相加時(shí)最高數(shù)值位不會(huì)產(chǎn)生進(jìn)位,從而導(dǎo)致雙符號(hào)不一致,得出溢出的結(jié)論;而當(dāng)兩個(gè)負(fù)數(shù)的絕對(duì)值沒有同時(shí)大于0.5,其補(bǔ)碼相加時(shí)最高數(shù)值位會(huì)產(chǎn)生進(jìn)位,得出結(jié)果無溢出。這種情形可以通過理論予以證明,我們這里只需要稍微了解一下。
那么,溢出以后如何解決呢?
假設(shè)求:-6+(-3)
-6的原碼:1 110 -3的原碼:1 011
-6的補(bǔ)碼:1 010 -3的補(bǔ)碼:1 101

由于包括符號(hào)位是四位,所以結(jié)果是0 100,是一個(gè)正數(shù),明顯產(chǎn)生了溢出。
為了解決這個(gè)問題,將數(shù)值位寬度增大為4位,則
-6的原碼:1 0110 -3的原碼:1 0011
-6的補(bǔ)碼:1 1010 -3的補(bǔ)碼:1 1101

最后結(jié)果是5位:1 0111 。由于這個(gè)結(jié)果是補(bǔ)碼,再求其原碼得到 1 1001,也就是-9,答案是正確的。