byte base = (byte)((byte)0xff >>> 2);
     System.out.println("b = " + base);
     System.out.println("b = " + Integer.toBinaryString(base));
     /**
      * 结果:
      * b = -1
      * b = 11111111111111111111111111111111
      */
    
    
     byte base2 = (byte)(0xff >>> 2);
     System.out.println("b2 = " + base2);
     System.out.println("b2 = " + Integer.toBinaryString(base2));
     /**
      * 结果:
      * b2 = 63
      * b2 = 111111
      */
求大神详解

解决方案 »

  1.   

    (byte)0xff 结果是-1,因为Java中byte是用8位来存储,只能表示-128~127之间的数,当由int强制类型转化为byte时,系统就采取了截取int后8位的做法。
      

  2.   

    第二种情况很好理解,这里不解释.主要是第一种情况:
    byte base = (byte)((byte)0xff >>> 2);这条语句实际执行过程是:
    1  (byte)0xff 
        把int型整数0xff(用2进制表示为 00000000 00000000 00000000 11111111)强制转换成byte型的,截取后8位。用2进制表示是 11111111,因为java都是有符号数,这个数的值是-1.
    2  (byte)0xff >>> 2 
        执行右移2位操作。
        因为java的移位操作只针对int型,所以这时要进行默认的类型转换,把byte型的-1 转成int型的-1,这个int型-1,用2进制表示是11111111 11111111 11111111 11111111,因为>>>操作左边空位补零,执行完操作后,这个数是 00111111 11111111 11111111 11111111,其值是1073741823。
    3   (byte)((byte)0xff >>> 2) 
        再次做类型转换,截取后8位。转换后的2进制为 11111111,其值是 -1。Integer.toBinaryString(base) 这个方法要求的参数为int型,所以在执行的时候还是进行了类型转换,把byte型-1 转成int型-1,就是看到的那个结果。
      

  3.   

    “>> 右移”;“<< 左移”;“>>> 无符号右移” byte base2 = (byte)(0xff >>> 2); 无符号右移 ,前面应该补0 ;
    11111111>>>2  --> 00111111  byte base = (byte)((byte)0xff >> 2);右移,带符号 ,则原来符号位(最高位),前面补符号位
    11111111>>2  --> 11111111  
      

  4.   

    我3楼说的是没问题的,"低于int型的操作数将先自动转换为int型再移位。"