整數溢位:乘法導致災難
在 C 中,了解整數大小和類型對於避免潛在的溢位至關重要。讓我們檢查一下下面的程式碼片段:
long long int n = 2000*2000*2000*2000; // overflow long long int n = pow(2000,4); // works long long int n = 16000000000000; // works
為什麼第一行會導致溢出,而其他兩行卻沒有問題?
罪魁禍首在於 C 處理整數文字的方式和算術運算。預設情況下,整數文字是可以保存其值的最小類型,但不小於 int。在本例中,2000 是一個 int,通常是 32 位元類型。
執行算術運算時,編譯器會根據運算元類型遵循特定規則。在這種情況下,乘法是用整數完成的,它是所涉及的類型中較大的一個。然而,賦值是無關緊要的,因為 C 不會根據目的地推斷類型。
乘法的結果超出了 int 的容量,被儲存為 int,導致溢出。這就是為什麼第一行會觸發溢出,而其他兩行則不會。
要解決這個問題,我們可以透過附加後綴 LL(或 ll)來明確指定第一行中使用的常數類型)。這確保了文字被視為 long long int,從而防止溢出。
透過了解整數類型和算術運算在 C 中的工作原理,我們可以避免潛在的陷阱並確保我們的程式碼正確處理資料運算。
以上是為什麼C語言中整數乘法會導致溢位?的詳細內容。更多資訊請關注PHP中文網其他相關文章!