3

Java ドキュメントからint has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive)

クラスがありTest.javaます。

public class Test
{
    public static void main(String[] args)
    {
        int i=2147483647; //max positive value an int can store
        for(;;)
        {
            System.out.println(++i);
        }
    }
}

私の知る限り++i、 の値をi1 増やして例外をスローする必要があります。これ2147483648は、 では許可されていないためですint

しかし、上記のプログラムを実行すると (無限ループのため) 実行され、値を にインクリメントする代わりに、 に2147483648割り当てられた値は でiあり-2147483648、値は毎回 によってデクリメントされ1ます。

サンプル実行 (クラスを変更した後)

public static void main(String[] args)
{
    int i=2147483647;
    for(;;)
    {
        System.out.println(++i);
        System.out.println(++i);
        System.out.println(++i);
        System.out.println(++i);
        System.out.println(++i);
        break;
    }
}

出力:

-2147483648
-2147483647
-2147483646
-2147483645
-2147483644

回答/ヒントをいただければ幸いです。

4

5 に答える 5

13

私の知識によると、2147483648はintでは許可されていないため、++iはiの値を1増やして例外をスローする必要があります。

あなたの理解は間違っています。Java では、整数演算が静かにオーバーフローします。

JLS のセクション 15.18.2から:

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

于 2013-09-28T11:18:20.220 に答える
4

整数オーバーフローと呼ばれる状況に遭遇しました: http://en.wikipedia.org/wiki/Integer_overflow

于 2013-09-28T11:18:25.353 に答える
2

これは整数オーバーフローと呼ばれます。整数値の算術演算は決して例外をスローしません。これは Java だけの問題ではありません。

最小値と最大値intは、 が計算に十分かどうかを判断するのに役立ちます。

于 2013-09-28T11:19:13.030 に答える
2

Java では数値のアンダーフローとオーバーフローはオフ(無音)です。アンダーフローおよびオーバーフロー イベントの間、Java は数値の範囲のインクリメント/デクリメントを続けます。

セクション 4.2.2。整数演算

整数演算子は、オーバーフローまたはアンダーフローを決して示しません。

于 2013-09-28T11:20:18.680 に答える
1

正確な回答はしませんが、次のことを考慮してください。

  • 整数はJavaでどのように表現されますか(どのようなバイナリ数表現で)?
  • 可能な最大のバイナリ番号に 1 を追加するとどうなりますか?
于 2013-09-28T11:19:45.330 に答える