为什么这个Java表达式不将最终值强制转换为long类型?

为什么这个Java表达式不将最终值强制转换为long类型?,java,int,long-integer,multiplication,addition,Java,Int,Long Integer,Multiplication,Addition,这将导致时间=344094777669。 如果我投变量天,结果会不同 //date is a java.util date //date.getTime() = 1485462073669 int days = 3600; long time = date.getTime() + (days * 24 * 60 * 60 * 1000L); 这将导致时间=4639062073669 为什么需要将days转换为long类型才能正确计算表达式?Java是从左到右的。 date.getTime()

这将导致时间=344094777669。 如果我投变量天,结果会不同

//date is a java.util date
//date.getTime() = 1485462073669
int days = 3600;
long time = date.getTime() + (days * 24 * 60 * 60 * 1000L);
这将导致时间=4639062073669


为什么需要将days转换为long类型才能正确计算表达式?

Java是从左到右的。

date.getTime() + ((long) days * 24 * 60 * 60 * 1000L)
您还可以执行以下操作:

days *  24  *  60  *  60  *  1000L
int  * int  *  int *  int *  long
    int     *  int *  int *  long
           int     *  int *  long
                   int    *  long
                         long

但是。。。在你的情况下,它不应该改变任何事情。我运行您的代码,两种方法返回相同的结果。也许
date.getTime()
返回了另一个值?

我更想知道为什么会发生这种情况。第二个表达式是正确的,但我想知道为什么我需要强制演员。根据第一个链接,所有的数学运算都是用最大的数据类型来完成的,所以所有的变量不都应该转换为长的吗?特别是因为最后一个数字被定义为一个长类型。如果date是同一个对象,我看不出这段代码会给出不同的结果。将int转换为long不会改变任何内容。您确定这两种情况下的日期相同吗?是日期对象没有改变。我尝试了你的代码,但是我得到了相同的结果。但是
3600*24*60*60
不会溢出
int
。是的,但是等式的前半部分看起来不是311040000*1000L吗?311040000不会使整型溢出。然后乘以long将适合于long。并且没有日期。getTime()每次都是相同的。我正在通过Intellij计算表达式。
1000L *  days *  24   *   60 * 60
long  *  int  *  int  *  int * int
    long      *  int  *  int * int
             long     *  int * int
                     long    * int
                           long