long oneYearWithL = 1000*60*60*24*365L;
long oneYearWithoutL = 1000*60*60*24*365;
您的第一个值实际上是一个长整型(因为 是 一个 ,并且是一个 ,因此具有值的值的结果是一个值。365L
long
1000*60*60*24
integer
multiplying
long
integer
long
但第二个值是一个整数(因为您只用一个值来多重计算一个值。因此,结果将是一个整数。现在,获得的结果超出了整数的实际范围。因此,在分配给变量之前,会将其截断以适合有效的整数范围。integer
integer
32-bit
multiplication
请看以下打印声明: -
System.out.println(1000*60*60*24*365L);
System.out.println(1000*60*60*24*365);
System.out.println(Integer.MAX_VALUE);
当您运行上述代码时: -
输出: -
31536000000
1471228928
2147483647
所以,你可以看到区别。
011101010111101100010010110000000000 -- Binary equivalent of 1000*60*60*24*365L
01111111111111111111111111111111 -- Binary equivalent of Integer.MAX_VALUE
因此,如果您不将其添加到数字的末尾,则会从第一个二进制字符串中删除4个最高有效位。L
因此,字符串变为..
(0111)01010111101100010010110000000000 -- Remove the most significant bits..
01010111101100010010110000000000 -- Binary equivalent of 1471228928
(您作为输出获得)
更新: -从上面的解释中,你也可以理解,即使在第一个赋值中,如果在你的结果之前把它乘以超出范围,那么它将再次被截断以适合整数范围,或者如果需要,则转换为,然后只有它将与.multiplication
integers
365L
2's complement representation
long value - 365L
例如: -
long thirtyYearWithL = 1000*60*60*24*30*365L;
在上面的示例中,请考虑第一部分 - 。此乘法的结果是: - .现在让我们看看它是如何表示的: -1000*60*60*24*30
2592000000
binary equivalent
2592000000 = 10011010011111101100100000000000 -- MSB is `1`, a negative value
01100101100000010011100000000001 -- 2's complement representation
表示的十进制表示形式为 。因此,在乘以之前转换为 。现在,由于此值适合于 is : - ,因此它不会被进一步截断。2's complement
1702967297
2592000000
-1702967297
365L
integer range
[-2147483648 to 2147483647]
因此,实际结果将是: -
long thirtyYearWithL = 1000*60*60*24*30*365L;
= 2592000000 * 365L;
= -1702967297 * 365L = -621583063040
因此,所有这些东西都只是考虑了应用算术运算时最终结果的实际结果。并且此检查对操作移动的每个临时结果执行(考虑具有关联性的运算符)。如果发现任何临时结果超出范围,则在继续下一个操作之前,将相应地将其转换为适合所需的范围。type
left to right
left-to-right
更新 2: -
所以,而不是: -
long thirtyYearWithL = 1000*60*60*24*30*365L;
如果你在开始时移动你的,那么你会得到正确的结果:-365L
long thirtyYearWithL = 365L*1000*60*60*24*30; // will give you correct result
因为,现在您的结果将是 类型 ,并且能够保持该值。temporary
long