在解读Think Java中有这么一个例子
public static void main(String[] args) {
int i = -1;
i >>>= 10;
System.out.println(i);
long l = -1;
l >>>= 10;
System.out.println(l);
short s = -1;
s >>>= 10;
System.out.println(s);
byte b = -1;
b >>>= 10;
System.out.println(b);
}
得到的结果如下:
然后感觉不对,为什么short、byte位移之后的结果是一个的呢?
根据书中对 “>>>”右移的描述是这样的:
Java 也添加了一种“无符号”右
移位运算符(>>>),它使用了“零扩展”:无论正负,都在高位插入0。
short s = -1 二进制:1111 1111 1111 1111
进行无符号右移后10位后期待的结果:0000 0000 0011 1111
但是实际上结果却是-1: 1111 1111 1111 1111
同样byte b = -1 的二进制: 1111 1111
期待结果:0000 0000
实际结果-1:1111 1111
结论
在byte short类型进行无符号右移运算中会把byte、short补齐位32位来进行运算,运算结束后进行类型强制转换。
short s = -1
s >>>= 10 这个运算过程中,
实际上进行运算的二进制是:1111 1111 1111 1111 1111 1111 1111 1111
进行了无符号右移10位后:0000 0000 0011 1111 1111 1111 1111 1111
然后再进行低位截取16位为short类型:1111 1111 1111 1111,故而得到的结果为-1
Byte的计算方式也是一样,
运算前:1111 1111 1111 1111 1111 1111 1111 1111
运算后:0000 0000 0011 1111 1111 1111 1111 1111
截取:1111 1111
如果把byte b = -1 进行右移25位,就可以看到这样的结果
运算前:1111 1111 1111 1111 1111 1111 1111 1111
运算后:0000 0000 0000 0000 0000 0000 0111 1111
截取:0111 111
得到的结果为127.
结论:在java中进行无符号>>> 右移运算过程中,byte、short类型会转换为int类型进行运算后,再对低位截取来完成类型的还原过程。