Javaでこれらの値を同じにするにはどうすればよいですか?
-Integer.MIN_VALUE == Integer.MIN_VALUE
値は次のとおりです。
-2147483648 : -2147483648
私はそれを比較してみましたが、trueを返します[すごい!]
Javaでこれらの値を同じにするにはどうすればよいですか?
-Integer.MIN_VALUE == Integer.MIN_VALUE
値は次のとおりです。
-2147483648 : -2147483648
私はそれを比較してみましたが、trueを返します[すごい!]
はい、それは予想される動作です。の範囲int
は -2147483648 ~ +2147483647 です。
JLS セクション 15.15.4から(強調鉱山):
整数値の場合、否定はゼロからの減算と同じです。Java プログラミング言語は整数に 2 の補数表現を使用し、2 の補数の値の範囲は対称的ではないため、負の最大値
int
orを否定long
すると、同じ負の最大値になります。この場合、オーバーフローが発生しますが、例外はスローされません。すべての整数値についてx
、-x
等しいです(~x)+1
。
~Integer.MIN_VALUE
はInteger.MAX_VALUE
... で、1 つ追加すると にオーバーローしInteger.MIN_VALUE
ます。
これが、反転コンパレータを実装するときに、これを行ってはならない理由です。
// BAD CODE!
public int compare(T x, T y) {
return -originalComparator.compare(x, y);
}
代わりに、これを使用します。
// This is fine, assuming the comparator obeys its contract
public int compare(T x, T y) {
return originalComparator.compare(y, x));
}
以下のコードを見てください。
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(-Integer.MIN_VALUE);
integer の最小値は-2147483648で、これを否定すると 2147483648と1大きいInteger.MAX_VALUE
ので範囲外になり、反対側に移動して -2147483648になります。
Java は 2 の補数演算を使用します。つまり、値を否定することは、ビットを反転して 1 を加算することと同じです。
しかし、ビット パターンが 100..00 の数字はどうでしょうか。ビットを反転すると 011..11 になり、1 を足すと 100..00 になります。
さまざまな理由から、この数値は表現できる最小の整数、つまり Integer.MIN_VALUE です。