为什么这不会导致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
时起作用?
有人能告诉我这个的原因吗?
麻烦的是,在计算上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