解析长到负数
码:
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
也足够,但有时看起来像资本I
或1
。 资本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();