先上一段代碼 簡單介紹一下問題
long now = System.currentTimeMillis();
long m1 = now-1000*60*60*24*30*3;
long test = (long)1000*60*60*24*30*3;
long nocast = 1000L*60*60*24*30*3;
long m2 = now-1000L*60*60*24*30*3;
System.out.println("我是test:"+test);
System.out.println(nocast);
System.out.println("now:"+now);
System.out.println("m1:"+m1);
System.out.println("m2:"+m2);
輸出結果:
我是test:7776000000
7776000000
now:1359510417546
m1:1360324352138
m2:1351734417546
有點奇怪了吧 1000*60*60*24*30*3的計算值與1000L*60*60*24*30*3 的計算值是不一樣的 1000*60*60*24*30*3 的計算結果是-813934592
而 (long)1000*60*60*24*30*3; 1000L*60*60*24*30*3;的計算結果都是7776000000 這個結果纔是需要的東西
爲什麼會出現這種情況呢 Java在做乘法時,如果沒有顯示確定的數據類型,那麼他會默認按照int數據類型進行計算就好比1000*60*60*24*30*3,這個數值在計算時導致int數據溢出,所以出現了負數的情況。
(long)1000*60*60*24*30*3; 1000L*60*60*24*30*3;這兩者,前者是將首個計算數強制造型爲long 然後按照long類型運算得出了正確的計算結果,後者在計算時將數據類型修改爲long 能直接獲得正確的計算結果,異曲同工。
這一點還是很隱晦的,要注意,防止以後出錯。這錯誤估計不好排查。
還有一點就是 L所在的位置,有點奇怪 1000L*60*60*24*30*3; 1000*60L*60*24*30*3;1000*60*60L*24*30*3;1000*60*60*24*30L*3;這幾種寫法都可以正確轉爲long型,但是1000*60*60*24*30*3L;就不對,而且3*60*60*24*30*1000這一種寫法的時候 L跟在任何一個數字後面都沒問題。有點莫名其妙,用的時候debug測試要優先確定這個串的計算結果。