このコードが間違った値を返すのはなぜですか?
int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
このコードが間違った値を返すのはなぜですか?
int i=Integer.MAX_VALUE+1;
long l=Integer.MAX_VALUE+1;
System.out.println(l);
System.out.println(i);
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
も間違った結果を示している理由は、 int
s に加算を実行してから暗黙的に に変換しているためlong
です。あなたがする必要があります:
long l = (long) Integer.MAX_VALUE + 1
System.out.println(l); // now prints the correct value
名前Integer.MAX_VALUE
が示すように、 で使用できる最大値ですInteger
。Java では、Integer がその最大値を 1 超える (または 1 だけオーバーフローする) 場合、その値は になりますInteger.MIN_VALUE
。
整数の加算がオーバーフローした場合、結果は十分に大きな 2 の補数形式で表される数学的合計の下位ビットになります。オーバーフローが発生した場合、結果の符号は、2 つのオペランド値の数学的な合計の符号と同じではありません。
Float または Double を使用すると、このオーバーフローが発生しないことに注意してください。値は次のようになります。POSITIVE_INFINITY
オーバーフローする演算は符号付き無限大を生成し、アンダーフローする演算は非正規化値または符号付きゼロを生成し、数学的に明確な結果を持たない演算は NaN を生成します。
資力 :
この型 (2^31 - 1) で表現できない値を格納しようとして、ここで 32 ビット整数型をオーバーフローさせています。
int i = Integer.MAX_VALUE + 1;
Java 整数は、-2,147,483,648 から 2,147,483,647 までの 32 ビット符号付きタイプの範囲です。
i
のように整数変数を設定することはできませんi=Integer.MAX_VALUE+1;