5

重複の可能性:
Java Numberデータ型がオーバーフローしないのはなぜですか?

Javaでは、値をインクリメントし続けByte、サイズ容量を超えたときに、ランタイム例外をスローしないのはなぜですか?例えば:

public static void main(String[] args) {
    byte b = 127;
    ++b;
    System.out.println(b);
}

上記のコードはを出力します-128。投げたら良くないのではRuntimeException?なぜこのように設計されているのですか?

他のプリミティブ型についても同じですInteger

int c = 2147483647;
++c;
System.out.println(c);

上記のコードはを出力し-2147483648ます。

4

3 に答える 3

7

整数オーバーフローは、実際にはコンピューティングで非常に役立ちます。例外がスローされると、多くの巧妙なアルゴリズムが突然壊れるか、実用的ではなくなります。たとえば、固定小数点演算を含むものはすべて、突然例外に悩まされます。

問題は、オーバーフローが発生しないようにプログラムに制限を設けているため (問題が発生する場合)、オーバーフローは通常は問題になりません。また、それを具体的に悪用するためのプログラムを設計することもあります。

オーバーフローを「最大サイズを超える値」と考えないでください。それは技術的に不可能です。ビットは単純にラップアラウンドし、そのデータ型の制限内にとどまります。

オーバーフローをチェックして例外を生成する必要がある場合は、次のようにします。

byte b = 127;
byte oldb = b;
b++;
if( b < oldb ) {
    // Calamity!!!  Raise an exception!
}

整数制限を恐れないでください。彼らを理解し、協力することを学びましょう。

于 2012-07-31T04:33:16.980 に答える
1

JVM Specsには次のように記載されています。

于 2012-07-31T04:32:26.303 に答える
1

整数演算と浮動小数点演算の動作は、CPU の一般的な動作に基づいた C での同じ操作の動作に基づいています。オーバーフローまたはアンダーフローは例外をトリガーしません (残念ながら Java がアクセスできないフラグが他にあります)。ゼロによる浮動小数点除算は Not-A-Number として定義されているため、これは割り込みをトリガーしません。

于 2012-07-31T07:20:56.457 に答える