代码:
public class Main{
public static void main(String[] a){
long t=24*1000*3600;
System.out.println(t*25);
System.out.println(24*1000*3600*25);
}
}
打印:
2160000000
-2134967296
为什么?
感谢所有回复。
是数字后使用L的唯一方法吗?
我尝试了(long)24*1000*3600*25
,但这也是否定的。
答案 0 :(得分:18)
您达到int
类型的最大值Integer.MAX_VALUE
或2 ^ 31-1。它因此包裹,因此显示负数。
有关此内容的即时解释,请参阅此漫画:
答案 1 :(得分:11)
要清楚地解释清楚,
System.out.println(24*1000*3600*25);
在上面的陈述中实际上是int
文字。要将它们视为long
字面值,您需要使用L
对其进行后缀。
System.out.println(24L*1000L*3600L*25L);
警告,一个小l
也足够了,但有时看起来像资本I
或1
。资本I
在这里没有多大意义,但将其视为1
确实可以给您带来困难。此外,即使只使用L
的单个值,也会产生结果long
。
答案 2 :(得分:6)
在第一种情况下,您要打印long
,但在第二种情况下,您将其打印为int
。
int
的范围是:-2 ^ 31到2 ^ 31 - 1,它正好在你计算的范围之下(int max:2147483647 you:2160000000)所以你将int溢出到负范围
您也可以强制第二个使用long
:
System.out.println(24L*1000*3600*25);
答案 3 :(得分:3)
你应该用'l'来后缀数字。请查看以下代码段:
public static void main(String[] a){
long t=24*1000*3600;
System.out.println(t*25);
System.out.println(24l*1000l*3600l*25l);
}
答案 4 :(得分:2)
默认情况下,整数文字被视为类型int
。 24*1000*3600*25
大于Integer.MAX_VALUE
,因此溢出并评估为-2134967296。您需要使用L后缀明确地使其中一个long
来获得正确的结果:
System.out.println(24L*1000*3600*25);
答案 5 :(得分:1)
如果你想用大数值进行数学运算而不过度流动,试试BigDecimal类。
假设我想要乘以
200,000,000 * 2,000,000,000,000,000,000L * 20,000,000
int testValue = 200000000;
System.out.println("After Standard Multiplication = " +
testValue *
2000000000000000000L *
20000000);
该操作的值为-4176287866323730432,这是不正确的。
通过使用BigDecimal类,您可以消除丢弃的位并获得正确的结果。
int testValue = 200000000;
System.out.println("After BigDecimal Multiplication = " +
decimalValue.multiply(
BigDecimal.valueOf(2000000000000000000L).multiply(
BigDecimal.valueOf(testValue))));
使用BigDecimal后,乘法返回正确的结果
80000000000000000000000000000000000
答案 6 :(得分:0)
(int)Long.valueOf("2345678901").longValue();