13

24 * 60 * 60 * 1000 * 1000 を 24 * 60 * 60 * 1000 で割った値が Java の 1000 に等しくないのはなぜですか?

4

3 に答える 3

60

乗算により 32 ビット整数がオーバーフローするためです。64 ビットでは問題ありません。

public class Test
{
    public static void main(String[] args)
    {
        int intProduct = 24 * 60 * 60 * 1000 * 1000;
        long longProduct = 24L * 60 * 60 * 1000 * 1000;
        System.out.println(intProduct); // Prints 500654080
        System.out.println(longProduct); // Prints 86400000000
   }
}

明らかに、乗算がオーバーフローした後、除算はそのオーバーフローを「元に戻す」ことはありません。

于 2009-08-19T17:16:41.503 に答える
22

int がオーバーフローするため、24L * 60 * ... から始める必要があります。

あなたの質問は、Java Puzzlers の Puzzle 3: Long Division のコピー/貼り付けです; )

于 2009-08-19T17:17:01.800 に答える
3

その計算を実行する場合は、(オーバーフローを避けるために) 操作の順序を変更するか、より大きなデータ型を使用する必要があります。本当の問題は、Java の固定サイズの整数に対する算術演算が結合的でないことです。面倒ですが、トレードオフがあります。

于 2009-08-19T17:18:18.287 に答える