3

Javaでこれらの値を同じにするにはどうすればよいですか?

-Integer.MIN_VALUE == Integer.MIN_VALUE

値は次のとおりです。

-2147483648 : -2147483648

私はそれを比較してみましたが、trueを返します[すごい!]

4

3 に答える 3

7

はい、それは予想される動作です。の範囲intは -2147483648 ~ +2147483647 です。

JLS セクション 15.15.4から(強調鉱山):

整数値の場合、否定はゼロからの減算と同じです。Java プログラミング言語は整数に 2 の補数表現を使用し、2 の補数の値の範囲は対称的ではないため、負の最大値intorを否定longすると、同じ負の最大値になります。この場合、オーバーフローが発生しますが、例外はスローされません。すべての整数値についてx-x等しいです(~x)+1

~Integer.MIN_VALUEInteger.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));
}
于 2013-06-29T09:46:44.993 に答える
6

以下のコードを見てください。

System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(-Integer.MIN_VALUE);

integer の最小値は-2147483648で、これを否定すると 21474836481大きいInteger.MAX_VALUEので範囲外になり、反対側に移動して -2147483648になります。

于 2013-06-29T09:46:00.300 に答える
0

Java は 2 の補数演算を使用します。つまり、値を否定することは、ビットを反転して 1 を加算することと同じです。

しかし、ビット パターンが 100..00 の数字はどうでしょうか。ビットを反転すると 011..11 になり、1 を足すと 100..00 になります。

さまざまな理由から、この数値は表現できる最小の整数、つまり Integer.MIN_VALUE です。

于 2013-06-29T09:50:31.537 に答える