Java隱晦的int溢出 切忌想當然

先上一段代碼 簡單介紹一下問題

	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測試要優先確定這個串的計算結果。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章