問題背景
今天在寫代碼時,將之前的一個變量進行了修改,運行單測的時候發現單測跑不過了,有點疑惑:
原代碼簡化下:
count = 123;
Long MAX_SIZE = 3 * 1024 * 1024 * 1024L;
if (count > MAX_SIZE) {
do error 邏輯
}
修改後的代碼:
count = 123;
long MAX_SIZE = 3 * 1024 * 1024 * 1024;
if (count > MAX_SIZE) {
do error 邏輯
}
做此次修改主要是避免每次都拆裝箱,結果修改後,if 條件變爲了true,執行到了 異常流的處理邏輯。
原因
java中的整型默認爲int, 3 * 1024 * 1024 * 1024 超過了 int 的最大值(2 的 31 次方 - 1 = 2147483648 - 1 = 2147483647),導致溢出變爲了 -1073741824,所以出現了上面的問題。
知識點
java中的整型默認爲int,int轉爲long是安全的,所以會自動轉,能編譯通過。
浮點數不加F默認是double類型,double轉float可能損失精度,因爲不會自動轉,編譯通不過。
轉換的目的類型佔得空間範圍一定要大於轉化的源類型
正向過程:由低字節向高字節自動轉換
byte->short->int->long->float->double
逆向過程不會自動轉,編譯通不過,使用強制轉換,可能丟失精度。