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处溢出。将操作数强制转换为(长)以避免此溢出。