2015-01-09 18 views
1

我試圖總結我的周圍三三兩兩內溢出頭補充例如說我想帶走這兩個二進制數: 1111 1000 0100 - 010 111 001 000我們是否忽略二進制補碼溢出

我將第二個二進制數轉換爲它的兩個補碼等價物,然後簡單地添加它,但我注意到它導致了溢出1,我是否忽略溢出?或者是有一個規則我必須遵循 1111 1000 0100 + 1010 0011 1000 =(1)1001 1011 1100

回答

1

短的答案:

如果要在固定寬度的二進制數執行算術運算,使用兩個的補數表示負數,那麼是的,你忽略了一位溢出。

龍答:

可以考慮每個個位ň位二進制補碼有位值2^,0 < = < ñ具有位值-2 ^(n-1)的位_1(具有位符號位),具有位_n_1。這是一個負號位符號位的值。如果計算兩個這樣的數字,好像他們是無符號ň位二進制數的總和,這些情況都很好:

  • 符號位未在任何加數或在結果集(重新解釋在二進制補碼錶示中),
  • 在正好一個加數中設置符號位,而不管溢出(如果它發生時被忽略)或
  • 在兩個加數中設置符號位(因此存在是一個溢出,它被忽略)和結果。

要理解這個問題,可能更容易將問題看作兩個獨立的總和:符號位的總和和值(其他)位的總和。數值和的溢出會產生一個溢出位,其位置值爲2 ^(n -1) - 正好是符號位位值的倒數 - 因此這種溢出會取消的一個符號位。

負+負的情況下需要這樣的消除以使結果可表示(兩個符號位+一個值溢出=一個符號位),並且正+正情況不能適應這種消除,因爲沒有符號位可以取消。在肯定+否定的情況下,正好在那些結果是非負的情況下,值位和的溢出;您可以考慮取消負加數的符號位,這會產生與忽略整個無符號和的溢出相同的結果,並將總和重新解釋爲二進制補碼數。

其餘情況下產生的數學結果不能用n位二進制補碼格式表示 - 大於最大可表示數或小於最小值。如果你忽略溢出,那麼這樣的結果可以通過明顯的符號翻轉來識別。你所做的是錯誤恢復策略的問題。

0

從維基百科有關2的補充文章,在https://en.wikipedia.org/wiki/Two%27s_complement#Addition的加法部分,我的理解是,超出給定(固定)位長度(向左)的進位可以忽略,但不會溢出,當最左邊的兩位進位不同。本文介紹如何維持進行,以判斷是否有溢出,這裏是在同一樣式簡單的例子:

在4位補-2是1110和+3爲0011這樣

11110 carry 
1110 -2 
+0011 +3 
---- 
10001 which is 0001 or simply 1 ignoring the carry in bit 5 and is 
     safe since the leftmost two bits in the carry row are identical