[英]What are arithmetic underflow and overflow in C?
算術下溢和溢出在C編程中意味着什么?
溢出
來自http://en.wikipedia.org/wiki/Arithmetic_overflow :
當計算產生的結果大於給定寄存器或存儲位置可以存儲或表示的結果時發生的條件。
所以,例如:
uint32_t x = 1UL << 31;
x *= 2; // Overflow!
請注意,正如@R在下面的評論中提到的那樣,C標准建議:
涉及無符號操作數的計算永遠不會溢出,因為無法通過生成的無符號整數類型表示的結果將以比結果類型可以表示的最大值大1的數量為模。
當然,這是“溢出”的一個相當特殊的定義。 大多數人會將模數減少(即環繞)稱為“溢出”。
潛流
來自http://en.wikipedia.org/wiki/Arithmetic_underflow :
當浮點運算的真實結果的幅度(即,接近於零)小於目標數據類型中可表示為正常浮點數的最小值時,可能發生的計算機程序中的條件。
所以,例如:
float x = 1e-30;
x /= 1e20; // Underflow!
計算機僅使用0和1來表示數據,以便可以表示的值范圍受到限制。 許多計算機使用32位來存儲整數,因此在這種情況下可以存儲的最大無符號整數是2 ^ 32 -1 = 4294967295.但是第一位用於表示符號,因此,實際上,最大的值是2 ^ 31 - 1 = 2147483647。
超出允許范圍的整數需要的位數多於可存儲的位數的情況稱為溢出。
類似地,對於實數,指數太小而無法存儲會導致下溢。
int,C中最常見的數據類型是32位數據類型。 這意味着每個int在內存中被賦予32位。 如果我有變量
int a = 2;
它實際上將在內存中表示為32位二進制數:00000000000000000000000000000010。
如果你有兩個二進制數,如
10000000000000000000000000000000
和
10000000000000000000000000000000,
它們的總和將是10000000000000000000000000000000000,這是33位長。 但是,計算機只占用32個最低有效位,它們都是0.在這種情況下,計算機識別出總和大於32位存儲的總和,並給出溢出錯誤。
下溢基本上是相反方向發生的事情。 用於C的浮點標准允許小數點后的23位; 如果數字的精度超過這一點,它將無法存儲這些位。 這導致下溢錯誤和/或精度損失。
下溢完全取決於給定的算法和給定的輸入數據,因此程序員沒有直接控制。另一方面,溢出取決於程序員對每個堆棧保留的內存空間量的任意選擇,以及這種選擇確實會影響溢出的次數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.