在Java中,+运算符会导致参与操作的变量自动提升为其中最大宽度的类型。
比如:
- short+int,会导致short自动提升为int再相加,变成int+int。
- int+String,会导致int自动提升为String再相加,变成String+String。
对于复合运算符来说,也是如此,且看下面一个死循环:
public static void main(String[] args) {
short i = -1;
System.out.println(Integer.toBinaryString(i)); // 展示short拓宽int后的二进制值
while (i != 0) {
// Java的数值运算低于int的,会先提升到int来计算
// 先拓宽
// 1111111111111111 = 》 11111111111111111111111111111111
// 无符号右移
// 01111111111111111111111111111111
// 窄化
// 01111111111111111111111111111111 = 》 1111111111111111
// 原因:不会产生任何变化;Java窄化int为short,将直接截掉高16位,又回到起点
i >>>= 1; // 复合运算符导致了short自动拓宽
System.out.println(Integer.toBinaryString(i));
}
}
总结:不要在short、byte或char类型上使用复合赋值运算符,避免自动拓宽为int再参与计算导致的bug。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/180278.html