public class Move
{
public static void main(String args[])
{
System.out.println((byte)(-5>>2) );
System.out.println((byte)(-5>>>2) );
}
}
--------------------Configuration: <Default>--------------------
-2
-2Process completed为什么结果一样呢,〉〉〉不是高位补00吗?
{
public static void main(String args[])
{
System.out.println((byte)(-5>>2) );
System.out.println((byte)(-5>>>2) );
}
}
--------------------Configuration: <Default>--------------------
-2
-2Process completed为什么结果一样呢,〉〉〉不是高位补00吗?
-5的补码计算:1000 0000 0000 0000 0000 0000 0000 0101
取反:1111 1111 1111 1111 1111 1111 1111 1010 //负数,符号位不变
+1:1111 1111 1111 1111 1111 1111 1111 1011
>>2:1111 1111 1111 1111 1111 1111 1111 1110 //负数,高位补1
(byte)(-5>>2):1111 1110 //int转换成byte,截掉高位
反转换补码: 1000 0010 = -2
-5>>>2
-5的补码计算:1000 0000 0000 0000 0000 0000 0000 0101
取反:1111 1111 1111 1111 1111 1111 1111 1010 //负数,符号位不变
+1:1111 1111 1111 1111 1111 1111 1111 1011
>>>2 0011 1111 1111 1111 1111 1111 1111 1110 //高位补0
(byte)(-5>>2):1111 1110 //int转换成byte,截掉高位
反转换补码: 1000 0010 = -2
-5>>2
-5的补码计算:1000 0000 0000 0000 0000 0000 0000 0101
取反:1111 1111 1111 1111 1111 1111 1111 1010 //负数,符号位不变
+1:1111 1111 1111 1111 1111 1111 1111 1011
>>2:1111 1111 1111 1111 1111 1111 1111 1110 //负数,高位补1
(byte)(-5>>2):1111 1110 //int转换成byte,截掉高位
反转换补码: 1000 0010 = -2
-5>>>2
-5的补码计算:1000 0000 0000 0000 0000 0000 0000 0101
取反:1111 1111 1111 1111 1111 1111 1111 1010 //负数,符号位不变
+1:1111 1111 1111 1111 1111 1111 1111 1011
>>>2 0011 1111 1111 1111 1111 1111 1111 1110 //高位补0
(byte)(-5>>>2):1111 1110 //int转换成byte,截掉高位
反转换补码: 1000 0010 = -2
你转换的时候用了(byte)转换,改成如下:public class Move
{
public static void main(String args[])
{
System.out.println( -50>>2 ); // 去掉byte的强制转换 输出-13
System.out.println( -50>>>2 ); //输出一个很大的整数,0011 1111 1111 1111 1111 1111 1111 1110 == 一个很很大的数...
}
}