2015-09-27 28 views
3

我看到,當我用two's complement減去正數和負數時,我得到溢出。例如,如果我減去1 2我得到:如何在二進制補碼中檢測到溢出?

2 = 0010 
1 = 0001 -> -1 = 1111 
2 + (-1) -> 0010 + 1111 = 10001 

所以這裏的結果是左五位10001 - 是溢出了嗎? 我發現這些規則來檢測溢出二進制補碼:

如果兩個正數的總和產生了負結果,總和 溢出。如果兩個負數的總和得到正數 結果,則總和已經溢出。否則,總和沒有溢出。

任何人都可以請詳細說明這些和顯示示例?

+0

您的最後一個示例不一致。 '-1'的值以四位給出,但您的答案是以五位計算的。如果你的字大小是5位,那麼'-1'的值應該是'11111',而不是'1111'。在一個5位字中,'1111'是值'15',而不是'-1'。你計算了'2 + 15 = -15'。另外,你的編程問題是什麼? (這不是一個真正的編程問題。) –

+0

對不起,我不明白。我將'-1'轉換爲四位,然後添加並接收五位。我應該怎樣做不同? –

+0

您添加了兩個帶符號的4位值並生成了一個5位結果,這會使4位值的原始計算無效。這就像向一個人展示一個1升的桶並告訴他們:「把它填滿,但只有5ml。」他們把995毫升。你有另一個桶裏有10毫升的水。你把它們倒入一個10升的桶中,然後說:「嘿,這個10升的桶沒有溢出,那個人把1升桶裏的水放進去了,因爲我預計它會溢出5毫升!」 –

回答

4

讓我們從題目問題的答案開始。

如何在二進制補碼中檢測到溢出?

溢出規則:如果添加具有相同符號的兩個數字(正或負二者),則溢出發生當且僅當所述結果具有相反的符號。

但你問你的問題後,你的問題的身體不同的東西。

所以這裏的結果有剩下的第五位10001 - 溢出了嗎?

不!這裏沒有溢出。第五位是進位/借位。隨身攜帶,如果你正在談論增加。借用,如果你在談論減法。

當您試圖表示的數字超出可以表示的數字範圍時,會發生溢出。在你的例子中,你使用的是4位二進制補碼,這意味着你可以表示-81000)到+70111)範圍內的任何數字。你的減法2-1的結果是+1,這是一個位於表示範圍內的數字。

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

大部分圍繞進位和溢出的誤解來自於我們使用進位作爲參數來產生溢出標誌的事實。他們強烈關聯,但他們不是一回事。

當在二進制補碼中添加數字時,如果進位和進位到最高有效位(符號位)不同,則意味着發生了溢出。

讓我們來看看兩個負操作數有一個積極的結果:

-8 + (-1) = -9 

1000 (carry) 
    1000 (-8) 
+ 1111 (-1) 
------ 
    0111 (+7) OVERFLOW! 

搬出爲1,隨身攜帶的籤位(MSB)爲0

而現在,一個例子兩個積極的操作數的負面結果。

+7 + 1 = +8 

0111 (carry) 
    0111 (+7) 
+ 0001 (+1) 
------ 
    1000 (-8) OVERFLOW! 

搬出是0和隨身攜帶的籤位(MSB)爲1

+0

中顯示了它,謝謝,我將讀一些關於'carry flag'和'overflow flag'的信息,並回答問題。 –

1

@ GabrielOshiro的答案是非常好的。我只想在這裏添加一點邏輯。當您添加2和-1一起在這裏

2 = 0010 
1 = 0001 -> -1 = 1111 
2 + (-1) -> 0010 + 1111 = 10001 

你應該從其餘位負數的最顯著位分開,因爲在二補該位帶來的負值。所以,如果你第一次添加一切第一:

0010 + 0111(leave out the leftmost 1 for now) = 1001 

在此之後,我們可以清楚地看到,在「10001」的第五位是通過將「1」在我們離開前面(第四位)1001引起的,在第五位產生進位。但是,由於這個「1」實際上應該與1001抵消,所以給我們留下0001,我們可以放心地忽略這裏的「10001」中的額外位。

更深入的推理會考慮我們什麼時候可以放心地忽略這個額外的位,什麼時候我們不能。正如@GabrielOshiro所說的那樣,當最重要的結果和結果不一樣時,我們不能忽視它。在進行中,由於沒有空間來容納額外的位,所以丟失了2個單位的負數,並且在攜帶中兩個正數的單位丟失,因爲假定爲正數的單位被認爲是一個負數的單位。這裏1 - (-1)= 2。因此,一個進位和一個進位將相互抵消。但是,當只有其中一個發生時,結果將不正確,因此我們有溢出。