先看一个例题:
//添加一个声明 while(i != 0){ i>>>=1; }
在添加声明处添加一行代码,使得上面的循环成为死循环
long i = -1;
或者 int = -1;
不能啊!!!
试试short i = -1;
出现什么了?
死循环了!!!!
既然出现了诡异现象(至少对于我是诡异)
为什么呢?
查阅资料发现复合赋值运算的一个规范
在复合赋值运算时,先将小于int的类型提升int型(即拓宽类型),然后进行计算,最后需要窄化的再窄化为指定的运算。
也就是说当i的类型为short时,先转化成int型(0xFFFFFFFF),然后右移(0x7FFFFFFF),最后再窄化成short(0xFFFFFFFF)
再观看下面的代码:
short x = 1; short y = 2; short z = x + y;
运行发现
Thirtyfirst.java:7: 错误: 可能损失精度 short z = x + y; ^ 需要: short 找到: int 1 个错误
也就是说这里也存在一个隐含的先拓展为int型,然后需要强制为short型
总结:
<1>、在进行算术运算的时候,如果运算符两边的数值都是比 int还低(即byte或short类型时,都是自动先转换为int类型来进行运算的)
<2>、在进行运算的时候,会自动的转换成级别高的那个来进行运算的,故结果也是高级别的那个,如果想为低的就需强制类型转换
时间: 2024-10-11 06:49:47