Java 为什么这不会导致1000人死亡?

Java 为什么这不会导致1000人死亡?,java,numbers,int,long-integer,Java,Numbers,Int,Long Integer,可能重复: 结果应该是1000,但不是1000。当我使用24*60*60*1000*1000L时,它为什么工作 有人能告诉我这是什么原因吗?麻烦的是,计算是在ints上进行的,然后被转换成long,不幸的是,24*60*60*1000*1000不能放入int中,并且会缠绕。你可以这样做 long micro=24L*60*60*1000*1000; 强制在long上执行最后一次乘法。可能是24*60*60*1000*1000被视为int并被截断 若要强制将其视为long,请在其中一个(或全部

可能重复:

结果应该是1000,但不是1000。当我使用
24*60*60*1000*1000L
时,它为什么工作


有人能告诉我这是什么原因吗?

麻烦的是,计算是在
int
s上进行的,然后被转换成
long
,不幸的是,24*60*60*1000*1000不能放入
int
中,并且会缠绕。你可以这样做

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

强制在long上执行最后一次乘法。

可能是
24*60*60*1000*1000
被视为int并被截断

若要强制将其视为long,请在其中一个(或全部)数字后面加上
L

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

很简单,如果你知道的话,但总是一个惊喜;)

文字
1000
是一个
int
值,因此乘法是用整数完成的,而不是用long完成的

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
值相乘时(除非您附加
l
l
,否则整数文本始终为
int
类型),那么结果也将始终为
int
类型
24*60*60*1000*1000
导致溢出,因为它大于可能的最大值
int
值(
Integer.MAX\u值

然后(在通过切割最高有效位“解决”溢出后),该值被分配给
long


将其中一个数字指定为
long
1000L
)意味着整数乘法是用
long
数字完成的。

这里的问题是
int
数据类型只支持数字,直到2000000000左右,而您的数字是86400000000,大约是这个数字的40倍。因此,您的乘法循环(丢弃结果的最高位)

因此,您需要切换到下一个更大的数据类型,
long
,告诉Java至少有一个数字是这样的:

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

这是因为您正在进行整数(32位)算术运算,然后将整数结果转换为长整数。因为数字太大,所以它不起作用

替换为:

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

要强制执行这些操作,必须使用long。

可以容纳的最大值和int是
整数。最大值
并且您的宏值大于整数可以容纳的值,并且对整数进行计算,因此它将被截断。如果你让其中一个乘数变长(以L或L结尾),它将正确计算

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

你得到的结果是什么?你今天上一个问题的答案也恰巧包含在内。你超出了int范围,需要告诉VM使用long。这个问题太简单了,在我输入我的答案时又有四个答案…我觉得这有点我的错。Rakesh以编辑的形式在他的原始帖子中添加了一个新问题——“任何人都可以告诉我关于VM的事……用JAVA处理nummbers”——我告诉他,如果他想让别人注意到这个问题,他应该问一个新问题。或者我不清楚,或者他不明白:为了补充这个(正确的)答案:因为右边的所有术语都是整数,算术,包括溢出,将在整数上完成。然后将结果转换为long。通过在右边添加一个“L”或一个(long),您可以强制将所有整数加宽转换为long(在溢出之前),结果不会溢出。joachim感谢您的帮助……这里有相同的问题2)int i=0;对于(a=0;a@Rakesh:请另提一个问题,评论并不是进行此类讨论的正确场所。
long milli=24*60*60*1000;
long micro=24*60*60*1000*1000L;
long result=micro/milli;