我有以下代码和输出:

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_VALUE。任何的想法?

最佳答案

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

您的问题是您要在发生溢出的地方乘以int。该计算中的每个数字都是int,因此其结果也是int。赋值后,结果int将转换为long,但那时为时已晚。

因此,使用类似

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


以确保整个计算在long内完成。或者,为了安全起见,只需将L附加在每个文字上。使您的意图非常明确:-)

关于java - 乘法时结果不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16213872/

10-10 12:57