乘以
问题描述:
当不同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。任何想法?
答
Java在这里猜测你的意图不够聪明。
你的问题是,你乘以int
s发生溢出。计算中的每个数字都是int
,因此其结果也是int
。在转让后,产生的int
转换为long
,但到那时为时已晚。
所以使用类似
long lon2 = 1000L * 3600 * 24 * 365;
,以确保整个计算在long
一事无成。或者,为了安全起见,在每个字面上加上L
即可。使您的意图非常清楚:-)
lon2的计算在32位诠释算法的右侧进行。因此,它溢出2^32 - 1而不是2^64 - 1。将操作数转换为(长)以避免溢出。 – 2013-04-25 11:51:33