Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 相乘时的不同结果_Java_Operators_Range - Fatal编程技术网

Java 相乘时的不同结果

Java 相乘时的不同结果,java,operators,range,Java,Operators,Range,我有以下代码和输出: public static void main(String[] args) { long lon = 1000; lon = lon * 3600; lon = lon * 24; lon = lon * 365; System.out.println("lon: " + lon); long lon2 = 1000 * 3600 * 24 * 365; System.out.println("lon2: "

我有以下代码和输出:

public static void main(String[] args) {
    long lon = 1000;
    lon = lon * 3600;
    lon = lon * 24;
    lon = lon * 365;

    System.out.println("lon:  " + lon);

    long lon2 = 1000 * 3600 * 24 * 365;
    System.out.println("lon2: " + lon2);
}
lon:  31536000000
lon2: 1471228928

我猜
lon2
出现了某种溢出,但我似乎无法理解。结果远远低于Long.MAX_值。有什么想法吗?

Java不够聪明,无法猜出您的意图

您的问题是,在溢出发生的地方,您正在乘以
int
s。该计算中的每个数字都是
int
,因此其结果也是
int
。赋值时,生成的
int
被转换为
long
,但到那时已经太晚了

所以使用类似

long lon2 = 1000L * 3600 * 24 * 365;

确保整个计算在
long
s中完成。或者,为了安全起见,只需在每个文本上粘贴
L
。使您的意图非常清楚:-)

Java不够聪明,无法在这里猜测您的意图

您的问题是,在溢出发生的地方,您正在乘以
int
s。该计算中的每个数字都是
int
,因此其结果也是
int
。赋值时,生成的
int
被转换为
long
,但到那时已经太晚了

所以使用类似

long lon2 = 1000L * 3600 * 24 * 365;

确保整个计算在
long
s中完成。或者,为了安全起见,只需在每个文本上粘贴
L
。非常清楚地表明您的意图:-)

lon2的计算是在32位整数算法的右侧完成的。因此,它在2^32-1处溢出,而不是在2^64-1处溢出。将操作数强制转换为(long)以避免溢出。lon2的计算在32位int算法的右侧完成。因此,它在2^32-1处溢出,而不是在2^64-1处溢出。将操作数强制转换为(长)以避免此溢出。