整數溢出
編輯在計算機編程中,當算術運算試圖創建超出可以用給定位數表示的范圍的數值時,就會發生整數溢出 - 高于xxx值或低于最小可表示值。
最常見的溢出結果是存儲結果的最低有效位; 據說結果環繞xxx值(即模基數的冪,在現代計算機中通常是兩個,但有時是十個或另一個基數)。
溢出條件可能會產生導致意外行為的結果。 特別是,如果未預料到這種可能性,溢出可能會危及程序的可靠性和安全性。
對于某些應用程序,例如定時器和時鐘,溢出時回繞可能是可取的。 C11 標準規定,對于無符號整數,模換行是定義的行為,術語溢出從不適用:涉及無符號操作數的計算永遠不會溢出。
在某些支持飽和算法的處理器上,如圖形處理單元 (GPU) 和數字信號處理器 (DSP),溢出的結果將被限制,即設置為可表示范圍內的最小值或xxx值,而不是環繞。
產地
編輯處理器的寄存器寬度決定了可以在其寄存器中表示的值的范圍。 盡管絕大多數計算機可以對內存中的操作數執行多精度算術運算,允許任意長的數字并避免溢出,但是寄存器寬度限制了可以使用的數字的大小(例如,加或減) 每個操作一條指令。 無符號整數的典型二進制寄存器寬度包括:
- 4 位:xxx可表示值 24 ? 1 = 15
- 8 位:xxx可表示值 28 ? 1 = 255
- 16 位:xxx可表示值 216 ? 1 = 65,535
- 32 位:xxx可表示值 232 ? 1 = 4,294,967,295(截至 2005 年個人計算機最常見的寬度),
- 64 位:xxx可表示值 264 ? 1 = 18,446,744,073,709,551,615(個人計算機中央處理器 (CPU) 最常見的寬度,截至 2021 年),
- 128 位:xxx可表示值 2128 ? 1 = 340,282,366,920,938,463,463,374,607,431,768,211,455
當無符號算術運算產生的結果大于上述 N 位整數的xxx值時,溢出會將結果縮減為 2 的 N 次方模,僅保留結果的最低有效位并有效地導致回繞。
特別是,兩個整數相乘或相加可能會得到一個意外小的值,而從一個小整數中減去可能會導致一個大的正值回繞(例如,8 位整數相加 255 + 2 結果為 1,這 是 257 mod 28,類似地,減法 0 ? 1 的結果是 255,即 ?1 的二進制補碼表示)。
這樣的回繞可能會導致安全損害——如果溢出的值被用作分配給緩沖區的字節數,緩沖區將被分配到意想不到的小,可能導致緩沖區溢出,根據緩沖區的使用,可能會在 turn 導致任意代碼執行。
如果變量具有帶符號的整數類型,則程序可能會假設變量始終包含正值。 整數溢出會導致值回繞并變為負數,這違反了程序的假設并可能導致意外行為(例如,8 位整數加法 127 + 1 的結果為 ?128,一個二的 128 的補碼)。 (這個特定問題的解決方案是使用無符號整數類型來表示程序期望并假定永遠不會為負的值。)
標志
編輯大多數計算機都有兩個專用處理器標志來檢查溢出情況。
當加法或減法的結果(將操作數和結果視為無符號數)不適合給定的位數時,會設置進位標志。 這表示從最高有效位進位或借位的溢出。
緊隨其后的帶進位加法或帶借位減法運算將使用此標志的內容來修改包含多字值較高部分的寄存器或內存位置。
當對有符號數的運算結果不具有可以從操作數的符號預測的符號時設置溢出標志,例如,將兩個正數相加時的結果為負數。 這表明發生了溢出,以二進制補碼形式表示的帶符號結果不適合給定的位數。
定義的變化和歧義
編輯對于無符號類型,當運算的理想結果超出該類型的可表示范圍并且返回結果是通過包裝獲得的,則通常將此事件定義為 overf。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/195916/