解析长到负数

码:

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但这也是否定的。

要清楚地解释清楚,

 System.out.println(24*1000*3600*25); 

在上面的语句中实际上是int literals。 要将它们视为long文字,您需要使用L后缀。

 System.out.println(24L*1000L*3600L*25L); 

警告,小l也足够,但有时看起来像资本I1 。 资本I在这里没有多大意义,但读到1可以真正给予困难。 此外,即使用L表示单个值也会使结果变long

您达到int类型的最大值,即Integer.MAX_VALUE或2 ^ 31-1。 它因此包裹,因此显示负数。

有关此的即时解释,请参阅此漫画:

替代文字

在第一种情况下,您打印的是long但在第二种情况下,您将其打印为int

int的范围是:-2 ^ 31到2 ^ 31 – 1,它正好在你计算的范围之下(int max:2147483647你:2160000000)所以你将int溢出到负范围。

您也可以强制第二个使用long

 System.out.println(24L*1000*3600*25); 

你应该用“l”后缀数字。 检查下面的代码:

  public static void main(String[] a){ long t=24*1000*3600; System.out.println(t*25); System.out.println(24l*1000l*3600l*25l); } 

默认情况下,整数文字被视为int类型。 24*1000*3600*25大于Integer.MAX_VALUE因此溢出并计算到-2134967296。 您需要使用L后缀明确地使其中一个为long以获得正确的结果:

 System.out.println(24L*1000*3600*25); 

如果您想要使用大数值进行数学运算而不会过度流动,请尝试使用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

 (int)Long.valueOf("2345678901").longValue();