3

このコードが間違った値を返すのはなぜですか?

int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
4

4 に答える 4

9

1 を追加するInteger.MAX_VALUEと、オーバーフローして にラップしInteger.MIN_VALUEます。

これは、Java が2 の補数を使用して整数を表すために発生します。4 ビットの例:

0000 : 0
0001 : 1
...
0111 : 7 (max value)
1000 : -8 (min value)
...
1110 : -2
1111 : -1

0111したがって、 (max) に1 を加える1000と になり、それが最小値になります。このアイデアを 32 ビットに拡張すると、同じように機能します。


あなたlongも間違った結果を示している理由は、 ints に加算を実行してから暗黙的に に変換しているためlongです。あなたがする必要があります:

long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value
于 2010-10-09T16:30:44.643 に答える
3

名前Integer.MAX_VALUEが示すように、 で使用できる最大値ですInteger。Java では、Integer がその最大値を 1 超える (または 1 だけオーバーフローする) 場合、その値は になりますInteger.MIN_VALUE

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

Float または Double を使用すると、このオーバーフローが発生しないことに注意してください。値は次のようになります。POSITIVE_INFINITY

オーバーフローする演算は符号付き無限大を生成し、アンダーフローする演算は非正規化値または符号付きゼロを生成し、数学的に明確な結果を持たない演算は NaN を生成します。


資力 :

于 2010-10-09T16:29:16.267 に答える
2

この型 (2^31 - 1) で表現できない値を格納しようとして、ここで 32 ビット整数型をオーバーフローさせています。

int i = Integer.MAX_VALUE + 1;
于 2010-10-09T16:27:55.203 に答える
0

Java 整数は、-2,147,483,648 から 2,147,483,647 までの 32 ビット符号付きタイプの範囲です。

iのように整数変数を設定することはできませんi=Integer.MAX_VALUE+1;

于 2010-10-09T16:31:24.940 に答える