4
public class Test {

    public static void main(String[] args) {    
        int sum=0;
        for(int i=1;i<10;i++)
            sum = sum+i*i*i*i*i*i*i*i*i*i;
        System.out.println(sum);                

    }    
}

OUTPUT:619374629

    for(int i=1;i<10;i++)
        sum = sum+i*i*i*i*i*i*i*i*i*i*i;
    System.out.println(sum);        

       OUTPUT:
        -585353335

2番目の出力では、整数の範囲を超えていると思いました.しかし、なぜそれが-ve数値を与えているのですか.エラーを与える必要があります.この動作の理由は何ですか?

前もって感謝します...

4

4 に答える 4

11

32 ビット整数のサイズをオーバーフローしました。

i が 10 に等しい場合に何が起こるかを考えてみましょう。

sum = sum + 100000000000 //1 with 11 zeroes

しかし、32 ビット整数に格納できる最大の正の数は、約 20 億 (2 と 9 つのゼロ) にすぎません。

実際、それはさらに悪化します!中間計算は限られた精度で実行され、10*10*10*10... の乗算がオーバーフローするとすぐに、10 は奇妙な負の数で乗算され、すでに間違っています。

したがって、最終的に得られる数値は算術規則に従っていないように見えますが、実際には、プリミティブ整数のストレージが限られていることを知っていれば、完全に理にかなっています。

解決策は、64 ビットを使用することです。longオーバーフローしないことを願っていますBigInteger

于 2013-06-03T04:04:41.590 に答える
6

Java では、整数演算を符号付き 2 の補数 mod 2^32 (int の場合) および 2^64 (long の場合) として定義しています。そのため、int 乗算の結果が 2^31 以上になると、ラップアラウンドして負の数になります。これは、整数演算が Java で機能する方法です。

Java仕様

于 2013-06-03T04:10:56.647 に答える
1

プリミティブ型を使用しています。したがって、整数がオーバーフローすると、それに含まれる負のビットのみが出力されます。エラーが必要な場合は、整数を試してください。

于 2013-06-03T04:04:41.650 に答える
1

あなたが予測したように、整数の範囲を渡しましたが、無限の値が発生しました (符号 [最上位ビット] が触れられるため)。

于 2013-06-03T04:06:31.737 に答える