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だけではありません。日食でT1を使用し、変数の上にマウスを置くと、同じ値を示す光沢が表示されます。

javaバージョン"1.6.0_33"OSX

4

3 に答える 3

8

intが2,147,483,647を超えることはできないため、オーバーフローが発生しています。最終的な値は型の範囲外ではありませんが、値であると明示的に指定しない限りlong、算術自体は数値をとして扱います。intlong

これを試して:

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に64ビット演算が乗算longされるintため、値が異なります。
と同等です

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

ここでの暗黙longは、精度の低下を防ぐのに十分早いです。

于 2012-07-29T03:58:37.067 に答える
1

これは、ではT1、すべての数値が整数であるため、数学演算は整数に対して実行され、longに割り当てられるためです。T3Longに整数を掛けているので、計算中に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億を手に入れます。これは整数が保持できるものよりも大きいです。したがって、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 に答える