可能重複:
Java problem-Whats the reason behind and what will be probable output爲什麼這不會導致1000?
long milli=24*60*60*1000;
long micro=24*60*60*1000*1000;
long result=micro/milli;
的結果應該是1000,但它不是。爲什麼它在我使用24*60*60*1000*1000L
時起作用?
有人能告訴我這個的原因嗎?
可能重複:
Java problem-Whats the reason behind and what will be probable output爲什麼這不會導致1000?
long milli=24*60*60*1000;
long micro=24*60*60*1000*1000;
long result=micro/milli;
的結果應該是1000,但它不是。爲什麼它在我使用24*60*60*1000*1000L
時起作用?
有人能告訴我這個的原因嗎?
麻煩的是,在計算上int
S DONE,然後澆鑄long
,不幸的是24 * 60 * 60 * 1000 * 1000不適合在int
和環繞。你可以做類似
long micro=24L*60*60*1000*1000;
強制最後一次乘法完成多頭。
這可能是24*60*60*1000*1000
被視爲一個int並被截斷。
,迫使它被作爲一項長期的治療,使號碼中的一個(或全部)長與L
後面添加它:
24L*60L*60L*1000L*1000L
容易,如果你知道,但總是出人意料;)
字面1000
是一個int
值,所以multiplaction是用整數和而不是用多頭來完成的。
long micro=24*60*60*1000*1000;
這樣解釋
long micro = (long) ((int) 24*60*60*1000*1000);
這是500654080
代替86400000000
至少使用一個長的文字在你的表達,這迫使long
做整個計算:
long milli=24*60*60*1000;
long micro=24*60*60*1000*1000 * 1L; // forces a calculation in long
long result=micro/milli;
當你告訴Java乘int
值(和整數文字總是int
類型的,除非你追加l
或L
),那麼結果將總是是int
類型爲好。 24*60*60*1000*1000
導致溢出,因爲它大於最大可能值int
值(Integer.MAX_VALUE
)。然後(在溢出通過切割最高有效位「解析」之後),該值被賦值爲long
的值。
指定號碼中的一個作爲long
(1000L
)表示整個乘法與long
號碼完成的。
這裏的問題是,int
數據類型只支持數字,直到2000000000左右,而你的號碼是86400000000,這是這個數字的約40倍。因此,你的乘法環繞(丟棄結果的最高位)。
所以你需要切換到下一個較大的數據類型,long
,告訴Java中你的號碼中的至少一個,意在這樣的:
long micro=24*60*60*1000*1000L;
那麼你的結果將是正確的。
這是因爲你正在做整數(32位)arythmetics,然後將int結果轉換爲long。即使數字太大,它也不起作用。
替換方式:
long milli=24*60*60*1000L;
long micro=24*60*60*1000*1000L;
long result=micro/milli;
迫使運營確實與渴望來完成。
最大值和int可以容納的值是Integer.MAX_VALUE
而且你的宏值大於一個整數可以容納並且對整數進行計算,所以它被截斷。如果您使其中一個乘數長(以L或l結尾),它會正確計算。
long milli=24*60*60*1000;
long micro=24*60*60*1000*1000L;
long result=micro/milli;
你得到的結果是什麼? – payne 2011-02-18 12:25:48
[轉帖](http://stackoverflow.com/questions/5039093/java-problem-whats-the-reason-behind-and-what-will-be-probable-output/5039121#5039121)你今天的問題這也恰好包含答案。 – 2011-02-18 12:28:16
你要走出int範圍,需要告訴VM使用long。 – Nishant 2011-02-18 12:29:58