理解C 算術中的Long Long 整數溢位
考慮以下程式碼片段:
long long int n = 2000 * 2000 * 2000 * 2000; // overflow
為什麼會這樣程式碼會導致溢出,儘管聲明了一個long long 變數來保存結果?
溢位的原因
問題在於整數常數 2000 的型別。預設情況下,整數常數會被指派可以容納其值的最小型別值不小於 int。由於 2000 可以儲存在 32 位元 int 中,因此這些文字的算術運算將作為 int 運算執行。
型別提升
雖然像n 這樣的long long 變數可以如果儲存較大的值,則使用乘法運算中存在的較大型別來呼叫算術運算符。然而,在這種情況下,無論目標類型如何,較大的類型仍然是 int。
溢位的意義
這表示乘法的結果2000 * 2000 * 2000 * 2000作為32位元整數計算,由於結果超過int的最大溢位而溢位容納。
替代方法
要避免這種溢出,您可以使用文字常數的LL 後綴或明確轉換運算子將整數文字明確轉換為long long (長 長):
long long int n = (long long)2000 * 2000 * 2000 * 2000; // no overflow
或者,您可以使用pow 函數來計算結果,確保使用long long 值執行計算:
long long int n = pow(2000, 4); // no overflow
透過明確轉換或使用pow 函數,可以確保使用long long 值執行計算,防止溢位。
以上是為什麼即使使用“long long”變量,整數文字相乘也會導致溢出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!