2011-02-18 139 views
-3

可能重複:
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時起作用?

有人能告訴我這個的原因嗎?

+2

你得到的結果是什麼? – payne 2011-02-18 12:25:48

+5

[轉帖](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

+0

你要走出int範圍,需要告訴VM使用long。 – Nishant 2011-02-18 12:29:58

回答

8

麻煩的是,在計算上int S DONE,然後澆鑄long,不幸的是24 * 60 * 60 * 1000 * 1000不適合在int和環繞。你可以做類似

long micro=24L*60*60*1000*1000; 

強制最後一次乘法完成多頭。

1

這可能是24*60*60*1000*1000被視爲一個int並被截斷。

,迫使它被作爲一項長期的治療,使號碼中的一個(或全部)長與L後面添加它:

24L*60L*60L*1000L*1000L 
5

容易,如果你知道,但總是出人意料;)

字面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; 
1

當你告訴Java乘int值(和整數文字總是int類型的,除非你追加lL),那麼結果將總是int類型爲好。 24*60*60*1000*1000導致溢出,因爲它大於最大可能值int值(Integer.MAX_VALUE)。然後(在溢出通過切割最高有效位「解析」之後),該值被賦值爲long的值。

指定號碼中的一個作爲long1000L)表示整個乘法與long號碼完成的。

1

這裏的問題是,int數據類型只支持數字,直到2000000000左右,而你的號碼是86400000000,這是這個數字的約40倍。因此,你的乘法環繞(丟棄結果的最高位)。

所以你需要切換到下一個較大的數據類型,long,告訴Java中你的號碼中的至少一個,意在這樣的:

long micro=24*60*60*1000*1000L; 

那麼你的結果將是正確的。

1

這是因爲你正在做整數(32位)arythmetics,然後將int結果轉換爲long。即使數字太大,它也不起作用。

替換方式:

long milli=24*60*60*1000L; 
long micro=24*60*60*1000*1000L; 
long result=micro/milli; 

迫使運營確實與渴望來完成。

0

最大值和int可以容納的值是Integer.MAX_VALUE而且你的宏值大於一個整數可以容納並且對整數進行計算,所以它被截斷。如果您使其中一個乘數長(以L或l結尾),它會正確計算。

long milli=24*60*60*1000; 
long micro=24*60*60*1000*1000L; 
long result=micro/milli; 
相關問題