2014-03-28 55 views
2

如果我用Two's Complement方法添加兩個帶符號二進制數,爲什麼它自動意味着如果進入MSB(符號)和進位不一致,溢出已被觸發?二進制補碼檢測溢出與進位

+0

我不得不說,這是自從我加入SO後我最喜歡回答的問題。對不起,有人花了這麼長時間來回答它。 – GabrielOshiro

回答

0

讓我們來看一個事實。

當我們添加一個負值和一個正值操作數時,結果將始終在表示範圍內。當我們添加具有相同符號的兩個數字(正數或負數)並且結果符號相反時,會發生溢出。

當我們在二進制補碼中添加數字時,我們將第一個操作數的符號位與第二個操作數的符號位相加。


當我們添加陽性+正操作數,符號位的總和爲0

0XXX (positive) 
+ 0XXX (positive) 
------ 
    0XXX (positive) 

這意味着它不會不管發生什麼事,永遠不會有一個進位添加正數+正操作數時。

所以,如果有一個隨身攜帶的成符號位

1 
    0XXX (positive) 
+ 0XXX (positive) 
------ 
    1XXX (negative) 

那隨身攜帶的1位將成爲結果的符號。這意味着我們添加了兩個積極的操作數,結果我們得到了一個負數。

搬出= 0
隨身攜帶的符號位= 1個
OVERFLOW!


當我們添加負+負操作數,符號位的總和是0與搬出。

1XXX (negative) 
+ 1XXX (negative) 
------ 
10XXX (positive) 

這意味着發生什麼並不重要,在添加負+負操作數時總是會執行一次。請注意,通過「默認」結果將是一個正數。它「需要」將結果調整爲與操作數相同的符號。如果在符號位中有一個進位,我們將有兩個負運算數,結果爲負。

所以,如果有沒有隨身攜帶到符號位

0 
    1XXX (negative) 
+ 1XXX (negative) 
------ 
10XXX (positive) 

那隨身攜帶的位0將成爲結果的符號。這意味着我們添加了兩個負運算數,結果我們得到了一個正數。

搬出= 1
隨身攜帶的符號位= 0
OVERFLOW!