讓我們從題目問題的答案開始。
如何在二進制補碼中檢測到溢出?
溢出規則:如果添加具有相同符號的兩個數字(正或負二者),則溢出發生當且僅當所述結果具有相反的符號。
但你問你的問題後,你的問題的身體不同的東西。
所以這裏的結果有剩下的第五位10001
- 溢出了嗎?
不!這裏沒有溢出。第五位是進位/借位。隨身攜帶,如果你正在談論增加。借用,如果你在談論減法。
當您試圖表示的數字超出可以表示的數字範圍時,會發生溢出。在你的例子中,你使用的是4位二進制補碼,這意味着你可以表示-8
(1000
)到+7
(0111
)範圍內的任何數字。你的減法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
您的最後一個示例不一致。 '-1'的值以四位給出,但您的答案是以五位計算的。如果你的字大小是5位,那麼'-1'的值應該是'11111',而不是'1111'。在一個5位字中,'1111'是值'15',而不是'-1'。你計算了'2 + 15 = -15'。另外,你的編程問題是什麼? (這不是一個真正的編程問題。) –
對不起,我不明白。我將'-1'轉換爲四位,然後添加並接收五位。我應該怎樣做不同? –
您添加了兩個帶符號的4位值並生成了一個5位結果,這會使4位值的原始計算無效。這就像向一個人展示一個1升的桶並告訴他們:「把它填滿,但只有5ml。」他們把995毫升。你有另一個桶裏有10毫升的水。你把它們倒入一個10升的桶中,然後說:「嘿,這個10升的桶沒有溢出,那個人把1升桶裏的水放進去了,因爲我預計它會溢出5毫升!」 –