0

在下面的代码中,我看不出 T1 和 T3 有什么不同。当然,我的计算器说它们不是。

public class longTest {
    public static final long T1 = 24 * 60 * 60 * 1000 * 30;
    public static final long T2 = 24 * 60 * 60 * 1000;
    public static final long T3 = T2 * 30;

    public static void main(String[] args) {

        System.out.println(T1);
        System.out.println(T2);
        System.out.println(T3);
    }
}

那么为什么我会得到以下输出:

-1702967296
86400000
2592000000

在这个示例程序中也不仅仅是 System.out.println。当我在 Eclipse 中有 T1 并将鼠标悬停在变量上时,我会得到一个显示相同值的光泽。

java版本“1.6.0_33”OSX

4

3 回答 3

8

您正在溢出,因为 anint不能大于 2,147,483,647。最终值不在long类型范围之外,但算术本身将数字视为int除非您明确声明它们是long值。

试试这个:

public class LongTest {

    public static final long T1 = 24L * 60 * 60 * 1000 * 30;
    public static final long T2 = 24L * 60 * 60 * 1000;
    public static final long T3 = T2 * 30;

    public static void main(String[] args) {
        System.out.println(T1);
        System.out.println(T2);
        System.out.println(T3);
    }
}
于 2012-07-29T03:49:36.563 回答
6

正如 paranoid-android 所说,这是一个int溢出问题。要了解 T3 为何不同,请参见下文。

public static final long T1 = 24 * 60 * 60 * 1000 * 30;

这里所有的数字都是ints 所以这和

public static final long T1 = (long) (24 * 60 * 60 * 1000 * 30);

部分溢出,int所以隐式转换long来得太晚,以避免精度损失。在

public static final long T2 = 24 * 60 * 60 * 1000;

你有相同的,但它的数字较小,适合 32 位int(正值为 31 位)和 64 位long

public static final long T3 = T2 * 30;

这将 a 乘以long64int位算术也是如此,这就是它具有不同值的原因。
相当于

public static final long T3 = T2 * (long) 30;

这里的隐含long足够早以防止精度损失。

于 2012-07-29T03:58:37.067 回答
1

这是因为在 中T1,所有的数字都是整数,所以数学运算是在整数上执行的,然后分配给一个长整数。T3将 Long 与 Integer 相乘,因此它在进行数学运算时使用 Long,结果符合预期。

要修复它,您需要将数字常量更改为长:

public class longTest {
   public static final long T1 = 24L * 60L * 60L * 1000L * 30L;
   public static final long T2 = 24 * 60 * 60 * 1000;
   public static final long T3 = T2 * 30;

   public static void main(String[] args) {

      System.out.println(T1);
      System.out.println(T2);
      System.out.println(T3);
   }

}

要理解为什么会得到一个负数:当它到达最大的正数 (2^31 -1) 时,它会环绕到最大的负数 (-2^31) 并从那里上升。这种包装可以发生多次,所以当你这样做时:

public static final int T4 = 100 * 100 * 100 * 100 * 100;// = 1410065408 WHAT!?!?

你得到 100 亿,这比 Integer 所能容纳的要大。所以,一旦它达到 2,147,483,647,它接下来会进入 -2,147,483,648 等等。所以,对于 100 亿,它是这样的:

2,147,483,647(转为负数,我们还有 7,852,516,353 剩余)

-2,147,483,648(一直计数到 Integer.MAX_INT)

2,147,483,647(再次转为负数,我们还有 3,557,549,057 剩余)

-2,147,483,648(加上剩余的 3,557,549,058)

现在我们有:1,410,065,408

于 2012-07-29T03:56:08.063 回答