Java中的数值运算自动拓宽导致bug

在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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值