解析长到负数

时间:2010-10-18 09:35:57

标签: java math numbers long-integer

代码:

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

7 个答案:

答案 0 :(得分:18)

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

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

alt text

答案 1 :(得分:11)

要清楚地解释清楚,

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

在上面的陈述中实际上是int文字。要将它们视为long字面值,您需要使用L对其进行后缀。

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

警告,一个小l也足够了,但有时看起来像资本I1。资本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)

默认情况下,整数文字被视为类型int24*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();