为什么这不会导致1000?

时间:2011-02-18 12:21:54

标签: java numbers int long-integer

  

可能重复:
  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时,为什么会这样?

有人可以告诉我原因吗?

7 个答案:

答案 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类型除非你附加lL),那么结果将< strong>始终也属于int类型。 24*60*60*1000*1000导致溢出,因为它比最大可能的int值(Integer.MAX_VALUE)大。

然后(在通过剪切最高有效位“解析”溢出之后),该值被赋值为long

将其中一个数字指定为long1000L)表示整个乘法用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;