可能重复:
Java problem-Whats the reason behind and what will be probable output
long milli=24*60*60*1000;
long micro=24*60*60*1000*1000;
long result=micro/milli;
结果应为1000但不是。当我使用24*60*60*1000*1000L
时,为什么会这样?
有人可以告诉我原因吗?
答案 0 :(得分:8)
问题是计算是在int
上进行的,然后是long
,不幸的是24 * 60 * 60 * 1000 * 1000不适合int
并包裹着。你可以做点什么
long micro=24L*60*60*1000*1000;
强制在longs上完成最后一次乘法。
答案 1 :(得分:5)
很简单,如果你知道,但总是一个惊喜;)
文字1000
是一个int
值,因此多重整理是用整数完成的,而不是用长整数。
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;
答案 2 :(得分:1)
可能是24*60*60*1000*1000
被视为int并且被截断。
要强制将其视为长整数,请将其中一个(或全部)数字加上L
后缀:
24L*60L*60L*1000L*1000L
答案 3 :(得分:1)
当你告诉Java乘以int
值(并且整数文字总是int
类型除非你附加l
或L
),那么结果将< strong>始终也属于int
类型。 24*60*60*1000*1000
导致溢出,因为它比最大可能的int
值(Integer.MAX_VALUE
)大。
然后(在通过剪切最高有效位“解析”溢出之后),该值被赋值为long
。
将其中一个数字指定为long
(1000L
)表示整个乘法用long
个数字完成。
答案 4 :(得分:1)
这里的问题是int
数据类型只支持大约2000000000之前的数字,而你的数字是86400000000,大约是这个数字的40倍。因此,你的乘法包裹(丢弃结果的最高位)。
因此,您需要切换到下一个更大的数据类型long
,告诉Java至少有一个数字是这样的:
long micro=24*60*60*1000*1000L;
那么你的结果是对的。
答案 5 :(得分:1)
这是因为你正在做整数(32位)的arythmetics,然后将int结果转换为long。数字太大,无法正常工作。
替换为:
long milli=24*60*60*1000L;
long micro=24*60*60*1000*1000L;
long result=micro/milli;
强制操作可以用多头来完成。
答案 6 :(得分:0)
最大值和int可以保持Integer.MAX_VALUE
,并且您的宏值大于整数可以容纳的值,并且对整数进行计算,因此它被截断。如果你将其中一个乘数设为长(以L或l结尾),它将正确计算。
long milli=24*60*60*1000;
long micro=24*60*60*1000*1000L;
long result=micro/milli;