public class Test {
public static void main(String args[]) {
byte b = (byte) 0xf1;
byte c = (byte) (b >> 4);
byte d = (byte) (b >>> 4);
byte e = (byte) ((b & 0xff) >> 4);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
}
}
以上结果是:
-15
-1
-1
15
貌似无符号右移失效了,变成有符号右移了,这是怎么回事呢,原因是java双目运算符参与运算时操作数被提升为int了,看一解释:
byte a = -64; byte b = (byte)(a >>> 4);
这里 a = 11000000b,那么无符号右移4位的结果应为 00001100b,即 b = 12。但是实际的执行结果为 b = -4,即 11111100b。
得到这个错误结果的原因是,Java中任何双目运算的运算数都会首先被扩展为 int,然后再进行运算。在这里运算过程如下:
byte 型 11000000 扩展为 int 型 11111111 11111111 11111111 11000000
无符号右移4位 00001111 11111111 11111111 11111100
强制转换为 byte 型 11111100
从上面的过程中我们可以得出结论,对于比int还要小的数值类型(short、byte)不应当进行无符号右移运算。