24 * 60 * 60 * 1000 * 1000 を 24 * 60 * 60 * 1000 で割った値が Java の 1000 に等しくないのはなぜですか?
20625 次
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 に答える