java中byte,short的无符号右移(>>>)的问题

在看《Java编程思想》的时候,遇到以下问题:

short i= -1;
System.out.println(Integer.toBinaryString(i));
i>>>=10;
System.out.println(Integer.toBinaryString(i));
System.out.println(i);
short z = i;
//期望结果:11111111111111111111111111111111
//         1111111111111111111111
//          一个正数
//实际结果:11111111111111111111111111111111
//         11111111111111111111111111111111
//          -1

在仔细阅读《java编程思想》中的话后,我发现是这样的:

无符号右移运算需要将i强转为int,然后无符号右移10位,在右移完成后,就是这个样子1111111111111111111111(22个1)然后由于i是一个short类型,所以1111111111111111111111(22个1)需要强转为:1111111111111111(16位short类型),还是-1,在进行转为二进制字符串输出时,就是又是11111111111111111111111111111111(32个1)。



那么根据我的猜想,用int的接收或者不将位移运算结果赋给自己则不会出现错误:

short z = -1;
System.out.println(Integer.toBinaryString(z>>>10));//1111111111111111111111(22个1)
//此时没有赋值强转,所以还是1111111111111111111111(22个1)
z = -1;
int s = z>>>10;
System.out.println(Integer.toBinaryString(s));//1111111111111111111111(22个1)
z = (short)s;
System.out.println(Integer.toBinaryString(z));//11111111111111111111111111111111(32个1)
System.out.println(z);//-1

所以在对byte,short,char进行无符号右移运算时,是这样的:
 
  
b>>>=10;
这一句等价于:
 
  
int temp = (int)b //short转为int当然不用强转,但是为了明显起见还是用了;
temp >>>=10;
b = (short)temp;
另外,Integer的Integer.toBinaryString()是先将short,byte类型转为int类型。但是值不变,然后转为字符串输出,是不会影响变量本身的值的。
也就是说这个输出的只是看一看int表示的二进制而已。

你可能感兴趣的:(右移操作符,Java,byte,short)