話說有這樣一個小例子:
MICROS_PER_DAY表示一天的微秒數
MILLIS_PER_DAY表示一天的毫秒數
然后下面例子的結果是多少呢?
1 public class Test3 { 2 public static void main(String[] args) { 3 final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000; 4 final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000; 5 System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY); 6 } 7 }
So easy
數據類型為 long
,很容易保存這兩個乘積不產生溢出.
因此,結果肯定是 1000
!
but….. 結果是:數據溢出!!!
但是但是long能表示 -2的63次方到2的63次方-1的整數.
數都數不過來,怎么會溢出?
小心陷阱啊,雖然我們定義的是long
類型,
准確的說最終的結果應該是long
類型的.
我們看看表達式右邊,
24 * 60 * 60 * 1000 * 1000
這個表達式是以int
類型作為運算的,
int
跟int
類型相乘,結果還是int
類型,
最終結果超過int所能保存的范圍,所以數據溢出了,
然后才被long
所保存;
改進
24 * 60 * 60 * 1000 * 1000–>24L * 60 * 60 * 1000 * 1000
在表達式隨便哪個數值后面加上一個l
或者L
就搞定了,
其結果會自動轉換為long
而不是int
了,然后再保存到long
類型變量中.
很簡單
原文地址:http://blog.csdn.net/CodeAi/article/details/46704777?locationNum=8&fps=1