4

Javaでさまざまな入力をチェックして無限ループを作成しようとしていたところint、最大制限を超えて増加すると負に変わることがわかりました-2147482958。無限ループでintを増やしているだけです...

コード:

public static void infiniteLoop(){
        for(int i=0;i>-1;i++){
            i = i + 1000;
            System.out.println(i);
        }
    }

最後に出力される値は、

2147483337
-2147482958

では、なぜマイナスになるのでしょうか。

4

4 に答える 4

10

なんでマイナスになるの?

intこれは、計算がオーバーフローしたときに Java で発生するように指定されているためです。

JLS 15.18.2

「整数の加算がオーバーフローした場合、結果は十分に大きな 2 の補数形式で表される数学的合計の下位ビットになります。オーバーフローが発生した場合、結果の符号は2 つのオペランド値の数学的な合計です。」


(これは、オーバーフローが常に負の数を与えると明示的に言っているわけではありません。また、常にそうであるとは限りません。しかし、ルールを適用すると、インクリメントInteger.MAX_VALUEby+1が与える理由を説明できますInteger.MIN_VALUE...)

于 2012-06-10T12:35:20.353 に答える
5

ドキュメントによると:

int データ型は、32 ビットの符号付き 2 の補数整数です。最小値は -2,147,483,648 (0x80000000) で、最大値は 2,147,483,647 (0x7FFFFFFF) (包括的) です。

したがって、整数の最大値に 1 を追加すると、次のようになります。

0x7FFFFFFF + 0x00000001 = 0x80000000 (-2,147,483,648)

于 2012-06-10T12:48:12.447 に答える
3

intの値がInteger.MAX_VALUEに達すると、それをインクリメントするとオーバーフローが発生し、 Integer.MIN_VALUEにラップアラウンドするためです。

より大きな整数を使用するには、代わりに64ビットのlongを使用します。

于 2012-06-10T12:37:28.603 に答える
1

int範囲は-2,147,483,648から2,147,483,647であるため。したがって、上限に達すると、オーバーフローして負の値から開始します。

ドキュメントを参照してください:

intデータ型は、32ビットの符号付き2の補数整数です。最小値は-2,147,483,648、最大値は2,147,483,647(両端を含む)です。

于 2012-06-10T12:36:36.850 に答える