乘以

问题描述:

当不同resuls我有下面的代码输出:乘以

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

+0

lon2的计算在32位诠释算法的右侧进行。因此,它溢出2^32 - 1而不是2^64 - 1。将操作数转换为(长)以避免溢出。 – 2013-04-25 11:51:33

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

你的问题是,你乘以int s发生溢出。计算中的每个数字都是int,因此其结果也是int。在转让后,产生的int转换为long,但到那时为时已晚。

所以使用类似

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

,以确保整个计算在long一事无成。或者,为了安全起见,在每个字面上加上L即可。使您的意图非常清楚:-)