演算溢位
维库,知识与思想的自由文库
arithmetic overflow(演算溢位)或簡稱為 overflow(溢位)有下列意義。
- 在電腦領域裡所發生的溢位條件是,執行單項數值計算時,當計算產生出來的結果是非常大的,大於暫存器或記憶體所能儲存或表示的能力限制。
- 在電腦領域裡,執行多項或累計的數值計算時,當計算產生出來的總值是非常大的,大於暫存器或記憶體所能儲存或表示的能力限制。要注意的是,溢位可能會在其他位址被置換。
大多數的電腦都可以區別以上兩種溢位條件。當加法或減法的結果發生進位,必須考量到當運算的數值與結果都是 unsigned numbers(無號數值,即「正數」)型態時,運算的結果就不適合使用這個數值型態。所以,在執行無號數值(正數)的加法或減法之後檢查進位旗標是非常有用的作法。「溢位」在運算結果為無號數值時容易發生,可以從有符號的運算數值預計出這類的情形(例如:兩個正整數相加產生的結果為一個負數)。所以,在執行 2 的補數的加法或減法之後檢查溢位旗標是非常有用的作法(換言之,有考慮到有號數值)。
有幾個控制溢位的方法:
- 設計:選擇正確的資料型態,尤其要注意資料長度與 signed/unsigned 資料符號。
- 迴避:事先注意指令的運作以及檢查運算的數值,或許可以確保計算出來的結果不會超過記憶體儲存資料的限制。
- 控制:當它被偵測到,還有在其他的程序完成時被檢測出來,那麼溢位是可以被預料的。例如:兩個位元大的兩個數值做加法計算,這種情形最可能發生,步驟如下:先加低位元再加高位元,但是如果它必須完成低位元的運算,就會產生位元加法的運算溢位,那麼就有必要做偵測和增加高位元的總和。通常 CPU 有支援偵測數值加法大於暫存器大小的作法,基本上這個作法是採用狀態位元的方式。
- 增值:假如儲存的數值過大就會被分配給其他特定的數值,這時溢位就會發生,然後傳回旗標值時就會產生連續運作的現象。檢查這個問題最有用的方法,就是在整體的計算結尾做一次性的檢查工作,而不是檢查每一個執行步驟。這個作法最常用在浮點硬體呼叫浮點運算器。
- 忽略:這是最普遍的作法,但是這個作法會得出不正確的結果,以及降低程式的安全性。
任何數除以零的計算「不」是演算溢位的一種。在數學上只能明顯算是不明確的定義;它計算出來的結果只能當成是「沒有」值,而不是非常大的無限數值。




