计算机中的不等式等价移项,需考虑数据的默认转换问题
有多少人想骂人?
shuting(音:虾挺 ,译:关闭,消停,闭嘴)
且看如下小段代码:
public static void main(String[] args) { int maxValue = Integer.MAX_VALUE; int minValue = Integer.MIN_VALUE; if (maxValue < minValue) { System.out.println("maxValue < minValue"); } System.out.println("minValue = " + (minValue)); System.out.println("maxValue = " + (maxValue)); System.out.println("minValue - maxValue = " + (minValue - maxValue)); System.out.println("maxValue - minValue = " + (maxValue - minValue)); if (maxValue - minValue < 0) { System.out.println("maxValue - minValue < 0"); } }
执行结果:
1 b = -2147483648 2 a = 2147483647 3 b - a = 1 4 a - b = -1 5 a - b < 0
这里出问题的原因是:默认转换所导致——
请看看这就清晰些:
1 public static void main(String[] args) { 2 int maxValue = Integer.MAX_VALUE; 3 int minValue = Integer.MIN_VALUE; 4 System.out.println("最大值:Integer.MAX_VALUE = " + (maxValue)); 5 int a1 = maxValue+1; 6 System.out.println("Integer.MAX_VALUE + 1 ——>" + (a1) ); 7 int a2 = maxValue+2; 8 System.out.println("Integer.MAX_VALUE + 2 ——>" + (a2) ); 9 int a3 = maxValue+5; 10 System.out.println("Integer.MAX_VALUE + 5 ——>" + (a3) ); 11 12 System.out.println("------------"); 13 14 System.out.println("最小值:Integer.MIN_VALUE = " + (minValue)); 15 int b1 = minValue-1; 16 System.out.println("Integer.MIN_VALUE - 1 ——>" + (b1) ); 17 int b2 = minValue-2; 18 System.out.println("Integer.MIN_VALUE - 2 ——>" + (b2) ); 19 int b3 = minValue-5; 20 System.out.println("Integer.MIN_VALUE - 5 ——>" + (b3) ); 21 }
执行结果:
1 最大值:Integer.MAX_VALUE = 2147483647 2 Integer.MAX_VALUE + 1 ——>-2147483648 3 Integer.MAX_VALUE + 2 ——>-2147483647 4 Integer.MAX_VALUE + 5 ——>-2147483644 5 ------------ 6 最小值:Integer.MIN_VALUE = -2147483648 7 Integer.MIN_VALUE - 1 ——>2147483647 8 Integer.MIN_VALUE - 2 ——>2147483646 9 Integer.MIN_VALUE - 5 ——>2147483643
原因:追溯到计算机以二进制运算,首位作为符号位。正数的首位为0(符号位),负数的首位为1(符号位)
具体参见:[底层] 为什么Integer.MIN_VALUE-1会等于Integer.MAX_VALUE (可继续参看引用)