Java int 乘法溢出問題
java中,高精度變量和低精度變量運算,結果會被提到高精度上;但是如果同樣精度的變量運算,只是保存結果的變量精度更高的話,其實並不能避免溢出,因為這樣運算的返回類型依然是原精度的類型,只是最后賦值的時候將一個低精度的結果賦值給了一個高精度變量上。其實是這樣的運算過程:
- 在乘方時 Java 發現結果已經超出了 int 基本數據類型的最大范圍(2147483647),於是作了默認的類型提升(type promotion),中間結果做為 long 類型存放,返回結果時目標數據類型 int 不能夠容納下結果,於是根據 Java 的基礎類型的變窄轉換(Narrowing primitive conversion)規則,把結果寬於 int 類型寬度的部分全部丟棄,也就是只取結果的低 32 位
- 而最后將int類型的結果變量賦值給一個高精度的Long
所以,為了避免數據溢出,我們需要讓參與運算的變量類型不能全是int,例如:
double d=1024d * 1024 * 1024 * 1024;
,加了d,使得一個變量類型變成了double就夠了