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。

你可能感兴趣的:(Java byte类型位运算中需要注意的问题)