Java Integer类的compareUnsigned()方法
一.概念
compareUnsigned()方法:
- 用于将两个整形参数转化为无符号整形后比较大小,
- 当两个参数的值相等时,返回0,
当前一个参数的值小于后一个参数的值时,返回 -1 ,
当前一个参数的值大于后一个参数的值时,返回1。
JDK API文档如下:
二.例题说明
1.第一种情况:两个参数都为正数时。
- 案例
- int a = 10;
int b = 20;
System.out.println("a与b比较之后的返回值为:" + Integer.compareUnsigned(a, b));
int c = 200;
int d = 100;
System.out.println("c与d比较之后的返回值为:" + Integer.compareUnsigned(c, d));
- 输出结果为:
a与b比较之后的返回值为:-1
c与d比较之后的返回值为:1
2.第二种情况:其中某一个参数为负数时。
- 案例
- int x = 50;
int y = -10;
System.out.println("x与y比较之后的返回值为:" + Integer.compareUnsigned(x, y));
- 输出结果为:
x与y比较之后的返回值为:-1
解释:由于y=-10,参数中存在负数;则首先把y的值-10转换为无符号整数,则y的值变为4294967286,此时50<4294967286,即x<y,因此比较之后返回-1。
拓展:怎么转化为无符号整数的呢??
在计算机里,我们知道,数字都是用二进制方式以补码形式进行存储的,而无符号整数最大的特点就是最高位不再当作符号位。那么此处为int类型的-10的补码是多少呢?由于int类型的整数占4个字节的内存,也就是32位,即32位二进制数。
可得 -10 的
原码为 10000000 00000000 0000000 00001010 //最左边的1为符号位,1表负数,0表正数
反码为 11111111 11111111 11111111 11110101 //在原码的基础上,符号位不变,其它位取反
补码为 11111111 11111111 11111111 11110110 //负整数的补码为反码加一,正整数的补码就是原码本身
故此:将求得的补码转为十进制,即2^32 -1-(2^0 +2^3)=4,294,967,286
另:可用Integer类的toUnsignedString()方法,转为一个无符号数的字符串,即Integer.toUnsignedString(-10)进行测试输出来验证结果
- 技巧:其中一个参数为负数时,比较大小小技巧:先把两个参数按正常比较方法来比较大小,然后把正常结果取反即为最终的结果值。 也就是说参数为负数的一方永远比参数为正数的一方要大。
比如此处的x和y,很明显50>-10,本来应该输出的是1,然后我们把它取反,为-1。最终的结果则为取反后的值-1。
······ 可用该技巧的原因:
int intMinValue = Integer.MIN_VALUE;// int类型的最小值
int intMaxValue = Integer.MAX_VALUE;// int类型的最大值
System.out.println("int类型的最小值为" + intMinValue + "转无符号后为" + Integer.toUnsignedString(intMinValue));
System.out.println("int类型的最大值为" + intMaxValue + "转无符号后为" + Integer.toUnsignedString(intMaxValue));
输出结果为 :
int类型的最小值为-2147483648转无符号后为2147483648
int类型的最大值为2147483647转无符号后为2147483647
》》由此可知:2147483648>2147483647,即int类型的最小值(最小负数)转无符号整数后仍然比int类型的最大值大。在int类型取值范围内,负数转无符号后其参数永远比正数的参数都要大。
3.第三种情况:两个参数都为负数时。
- 案例
- int a = -10;
int b = -20;
System.out.println("a与b比较之后的返回值为:" + Integer.compareUnsigned(a, b));
int c = -200;
int d = -100;
System.out.println("c与d比较之后的返回值为:" + Integer.compareUnsigned(c, d));
- 输出结果为:
a与b比较之后的返回值为:1
c与d比较之后的返回值为:-1
解释:
由于两个参数都为负数,则需要把他们两个参数都转换为无符号整数后再来比较大小。
我们知道,负数值越大其转化为无符号值也越大,负数值越小其转化为无符号值也越小,此处的-10大于-20,所以返回输出1,-200小于-100,所以返回输出-1,