乘以时的结果不同

时间:2013-04-25 11:45:20

标签: 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: " + lon2);
}
lon:  31536000000
lon2: 1471228928

我想lon2会发生某种溢出,但我似乎无法弄明白。结果低于Long.MAX_VALUE。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

Java在这里猜测你的意图并不够聪明。

您的问题是您将 int s 与溢出发生在一起。该计算中的每个数字都是int,因此其结果也是int。在分配时,生成的int会转换为long,但到那时为时已晚。

所以请使用类似

的内容
long lon2 = 1000L * 3600 * 24 * 365;

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