2017-07-26 293 views
1

我已經閱讀了溢出意味着兩個定義。溢出意味着什麼?

說,我們有如下補充:

11111111 
00000001 
-------- 
100000000 

我看過的第一個定義是這樣一個事實,結果沒有融入8位(它需要9位在這個例子中),那麼這被稱爲溢出。


我看過其他的定義是,如果我們有另外兩個有符號整數(例如兩個互補整數):

10011001 
10111011 
-------- 
101010100 

這時如果8位的結果(01010100)有符號與兩個整數的符號不同(在本例中它不同),那麼這稱爲溢出。

哪個定義正確?

+0

第一個定義是基礎。第二個是後效 – MBo

+0

它們實際上是一樣的東西 –

+0

一個是簽名的,另一個是未簽名的溢出,你應該這樣想。在這兩種溢出情況下,僅僅意味着你沒有足夠的位來正確表示結果。基本上你還需要一點。 –

回答

5

它們都是正確的。當數字的計算由於結果不再適合存儲的數字格式而導致錯誤時,會發生溢出。

因此,在第一種情況下,發生溢出是因爲您需要9位,並且只有8位可用(意味着現在存儲在該字節中的數字不能準確反映答案)。

在第二種情況下,發生溢出是因爲結果乾擾了帶符號的位,從而導致包含錯誤值的字節。

+0

很好的回答,歡迎來到SO! –

+0

由於CF OF&AF標誌中的轉換僅僅表示之前操作的結果,因此會導致某些讀者誤導「導致錯誤」。 X86中的錯誤,假設我們正在討論的架構會引發異常。 –

+0

我的意思是數學錯誤而不是運行時錯誤。在Z80中,兩種情況都觸發了CPU中的標誌,可以測試它是否發生溢出。 –

6

這兩種情況都可以通過增加一位來解決。 如Wikipedia page for Integer Overflow所示,當操作結果不符合目標寄存器/變量時,會發生整數溢出。例如。 0x10000 * 0x10000對於32位整數也是一個溢出。

典型處理器體系結構將無符號整數溢出與有符號整數溢出的情況分離爲狀態寄存器中的兩個不同標誌;攜帶/借用未簽名和溢出簽名添加。