复合赋值运算符之谜

先看一个例题:

//添加一个声明
while(i != 0){
      i>>>=1;       
}

在添加声明处添加一行代码,使得上面的循环成为死循环

long i = -1;

或者 int = -1;

不能啊!!!

试试short i = -1;

出现什么了?

死循环了!!!!

既然出现了诡异现象(至少对于我是诡异)

为什么呢?

查阅资料发现复合赋值运算的一个规范

在复合赋值运算时,先将小于int的类型提升int型(即拓宽类型),然后进行计算,最后需要窄化的再窄化为指定的运算。

也就是说当i的类型为short时,先转化成int型(0xFFFFFFFF),然后右移(0x7FFFFFFF),最后再窄化成short(0xFFFFFFFF)

再观看下面的代码:

short x = 1short y = 2short z = x + y;

运行发现

Thirtyfirst.java:7: 错误: 可能损失精度
        short z = x + y;
                    ^
  需要: short
  找到:    int
1 个错误

也就是说这里也存在一个隐含的先拓展为int型,然后需要强制为short型

总结:

<1>、在进行算术运算的时候,如果运算符两边的数值都是比 int还低(即byte或short类型时,都是自动先转换为int类型来进行运算的)

<2>、在进行运算的时候,会自动的转换成级别高的那个来进行运算的,故结果也是高级别的那个,如果想为低的就需强制类型转换

原文地址:https://www.cnblogs.com/qionghua520/p/4378374.html