A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 原满 中级黑马   /  2013-4-5 16:58  /  1665 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 原满 于 2013-4-5 19:53 编辑

class MoveTest
   {
     public static void main(String[] args){
         byte b = -15;
         b>>>=2;
        System.out.println(b);     
     }
}

-15 :11110001(补码)
无符号右移2位:00111100 | 01
变成了正数     00111100  即60

但运行输出是 -4

各位指点一下?
  

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 邓宫财 于 2013-4-5 17:30 编辑

这里主要是由于byte在进行位操作的时候系统自动将其转换成int类型,
所以操作结果其实应该为int型,不过由于">>>="这种复合赋值运算符会自动将右边的类型转换到左边的类型。
所以这里应该是发生了隐形的强制类型转换

所以运算步骤就是:
-15 的补码 1111 0001byte型,隐士转成int
              -> 1111 1111 1111 1111 1111 1111 1111 0001 然后向右无符号移动2位
              -> 0011 1111 1111 1111 1111 1111 1111 1100然后强转回去。
              ->                   1111 1100结果就是这个,换算就是 -4

下面这个例子就充分证明了,我一上的说法的正确性。
  1. int a = -15; //<span style="background-color: rgb(255, 255, 255);">1111 1111 1111 1111 1111 1111 1111 0001</span>
  2.         a = a>>>2; //<span style="background-color: rgb(255, 255, 255);">0011 1111 1111 1111 1111 1111 1111 1100</span>
  3.         System.out.println(a);
  4.         System.out.println((byte)a);//int强转成byte会丢失,前面24位。然后结果奇迹的就是-4.
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
  1. class MoveTest
  2.    {
  3.      public static void main(String[] args){
  4.          byte b = -15;
  5. //        b>>>=2;
  6.         System.out.println(b>>>2);     
  7.      }
  8. }

复制代码
你如果按上面这个方法输出的结果就是一个正数1073741820

b>>>=2此运算的效果基本上与指定 b= >>> 2 相同,不同的只是仅计算一次 b,,,,所以负数还是负数
>>>= 运算符将 b 的所有位右移 expression 指定的位数。用零填充右移后左边空出的位。右移的位被丢弃。该操作符屏蔽 expression 以避免将 result 移位太多。否则,如果移位量超出 result 的数据类型中的位数,则可能会移走所有的初始位,从而会提供无意义的结果。为了确保每次移位保留至少一个初始位,移位运算符将使用以下公式来计算实际移位量:使用 result 中的位数减一所得的结果来屏蔽 expression(使用按位“与”运算符)。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
是这样的俩个数参与运算其结果会取精度高的 b是byte型的 ,2默认是int型的,其结果本来会是int型的但是你在运算时用的是>>>= 像这种+=,-=,   *=,这种运算符会在程序内部进行个强转的过程会把结果强转为运算符左边的类型。负数的二进制就是其正数的二进制取反加一,所以-15的二进制就是1111 1111 1111 1111 1111 1111 1111 0001 无符号右移俩位,左边用0补,右边舍弃结果是0011 1111 1111 1111 1111 1111 1111 1100  结果再强转为byte型的 也就是只取后八位也就是1111 1100  换算成10进制就是-4.
回复 使用道具 举报
不好意思楼主刚才说错了 ,只这样的所有的char型 byte型,short型的数在参与运算时会被转成int型的数参与运算 int型的-15二进制就是1111 1111 1111 1111 1111 1111 1111 0001 无符号右移俩位,左边用0补,右边舍弃结果是0011 1111 1111 1111 1111 1111 1111 1100  结果再强转为byte型的 也就是只取后八位也就是1111 1100  换算成10进制就是-4.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马