Java byte类型位运算中需要注意的问题

在一个项目中,需要将hex字符串转为十六进制的byte数组然后对byte数组进行CRC校验,发现校验算法存在问题,总是不对,后来发现,byte中存在一个值-128,经过排查发现确实是这个异常值的原因,造成了CRC校验错误,0x80对应byte就是b = -128,但是Integer.toHexString(b)输出ffffff80,然后

int tmp = 0;

xxxx省略tmp的运算代码

tmp |=b;

的时候就出错了,最终tmp直接等于ffffff80,这样就造成了计算错误。其实正确的运算方法应该先将负数byte转为正数的int然后在int(32位)的精度下进行与或非运算。转换函数为

    public int byteToInteger(Byte b)
    {
        return 0xff & b;
    }

回到刚刚上面的问题,在int的32位精度下,128表示为0x80,这时候运算起来就不会有问题,对byte做运算一定要先转换为精度足够的数据类型比如int,重要的问题说三遍!

这里顺便提一下byte类型的表示范围,在Java中byte类型是8为的,也就是0x00到0xff,其中最高位表示正负号,最高位为0表示正数,为1表示负数,就是说按照二进制来看的话,就是表示0x00-0xff,但是作为数值来看的话正数范围为0x00到0x7f(127),负数范围为0xff(-128)到0x00。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值