为什么这不会导致1000?

问题描述:

可能重复:
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://*.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

麻烦的是,在计算上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类型的,除非你追加lL),那么结果将总是int类型为好。 24*60*60*1000*1000导致溢出,因为它大于最大可能值int值(Integer.MAX_VALUE)。然后(在溢出通过切割最高有效位“解析”之后),该值被赋值为long的值。

指定号码中的一个作为long1000L)表示整个乘法与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;