本页使用了标题或全文手工转换

算術溢出

维基百科,自由的百科全书
跳转至: 导航搜索

算術溢位(arithmetic overflow)或簡稱為溢位(overflow)指的是:

  1. 電腦領域裡所發生的溢位條件是,執行單項數值計算時,當計算產生出來的結果是非常大的,大於暫存器記憶體所能儲存或表示的能力限制。
  2. 在電腦領域裡,執行多項或累計的數值計算時,當計算產生出來的總值是非常大的,大於暫存器或記憶體所能儲存或表示的能力限制。要注意的是,溢位可能會在其他位址被置換。[來源請求]

加法器中央处理器算术逻辑单元中的核心之一。当长度为n位的两个二进制数经过加减法器运算,得到的长度为n位的结果不是正确值时,我们说发生溢出

檢查溢位[编辑]

大多數的電腦都可以區別以上兩種溢位條件。當加法或減法的結果發生進位,必須考量到當運算的數值與結果都是 unsigned numbers(無號數值,即「正數」)型態時,運算的結果就不適合使用這個數值型態。所以,在執行無號數值(正數)的加法或減法之後檢查進位旗標是非常有用的作法。「溢位」在運算結果為無號數值時容易發生,可以從有符號的運算數值預計出這類的情形(例如:兩個正整數相加產生的結果為一個負數)。所以,在執行 2 的補數的加法或減法之後檢查溢位旗標是非常有用的作法(換言之,有考慮到有號數值)。

定义A和B都是长度为n位的二进制数

(A)_2 = A_{n-1}A_{n-2}\cdots A_0

(B)_2 = B_{n-1}B_{n-2}\cdots B_0

(C)_2 = C_nC_{n-1}\cdots C_1

以下是竖式(第一行为进位):

其中C_iA_{i-1}+B_{i-1}的进位


1、输入的数是无符号整数,我们通过观察C判断是否溢出

a) C=1

i)如果是加法操作,结果不正确,结果溢出

ii)如果是减法操作,结果正确,结果未溢出

b) C=0

i)如果是加法操作,结果正确,结果未溢出

ii)如果是减法操作,结果不正确,结果未溢出。在这种情况下,结果是负数。然而,在无符号整数世界里,负数不存在,我们认识这样的操作是非法的。当然,如果认为答案是以有符号整数补码的形式出现,则结果正确。


2、输入的数是有符号整数,我们通过观察V判断是否溢出

a) V=1,结果不正确,结果溢出

b) V=0,结果正确,结果未溢出

控制溢位[编辑]

有幾個控制溢位的方法:

  1. 設計:選擇正確的資料型態,尤其要注意資料長度與 signed/unsigned 資料符號。
  2. 迴避:事先注意指令的運作以及檢查運算的數值,或許可以確保計算出來的結果不會超過記憶體儲存資料的限制。
  3. 控制:當它被偵測到,還有在其他的程序完成時被檢測出來,那麼溢位是可以被預料的。例如:兩個位元大的兩個數值做加法計算,這種情形最可能發生,步驟如下:先加低位元再加高位元,但是如果它必須完成低位元的運算,就會產生位元加法的運算溢位,那麼就有必要做偵測和增加高位元的總和。通常 CPU 有支援偵測數值加法大於暫存器大小的作法,基本上這個作法是採用狀態位元的方式。
  4. 增值:假如儲存的數值過大就會被分配給其他特定的數值,這時溢位就會發生,然後傳回旗標值時就會產生連續運作的現象。檢查這個問題最有用的方法,就是在整體的計算結尾做一次性的檢查工作,而不是檢查每一個執行步驟。這個作法最常用在浮點硬體呼叫浮點運算器
  5. 忽略:這是最普遍的作法,但是這個作法會得出不正確的結果,以及降低程式的安全性

除零計算[编辑]

任何數除以零的計算(Division by zero)「不是」算術溢位的一種。在數學上只能明顯算是不明確的定義(Defined and undefined);它計算出來的結果只能當成是「沒有」值,而不是非常大的無限數值。

相關參見[编辑]