如何否定一个值与java [Integer.Min_Value]中的值相同

Din*_*mar 3 java comparison

这些值如何在java中相同?

-Integer.MIN_VALUE == Integer.MIN_VALUE
Run Code Online (Sandbox Code Playgroud)

价值观是:

-2147483648 : -2147483648
Run Code Online (Sandbox Code Playgroud)

我试着比较它并返回真实[惊人!]

Jon*_*eet 7

是的,这是预期的行为.范围int是-2147483648到+2147483647.

JLS第15.15.4节(强调我的):

对于整数值,否定与从零减去相同.Java编程语言对整数使用二进制补码表示,并且二进制补码值的范围不对称,因此否定最大负数intlong导致相同的最大负数.在这种情况下会发生溢出,但不会抛出异常.对于所有整数值x,-x等于(~x)+1.

~Integer.MIN_VALUEInteger.MAX_VALUE...当你加一个,它就会溢出来Integer.MIN_VALUE.

这就是为什么当你实现一个反转比较器时,你不能这样做:

// BAD CODE!
public int compare(T x, T y) {
    return -originalComparator.compare(x, y);
}
Run Code Online (Sandbox Code Playgroud)

相反,使用这个:

// This is fine, assuming the comparator obeys its contract
public int compare(T x, T y) {
    return originalComparator.compare(y, x));
}
Run Code Online (Sandbox Code Playgroud)


Roh*_*ain 6

看下面的代码:

System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(-Integer.MIN_VALUE);
Run Code Online (Sandbox Code Playgroud)

为整数的最小值为-2147483648,当你需要否定为此,变得 2147483648,这是1大于Integer.MAX_VALUE,使其熄灭的范围内,并且朝向另一端移动,并成为 -2147483648