Java算术运算解惑:4字节数组转int结果不符问题排查
Java中byte数组转int结果不符的原因
核心问题:Java byte的有符号特性与符号扩展
Java的byte是有符号8位整数,取值范围为-128~127。你定义的bytes[0] = (byte)0x95,其二进制为10010101,最高位是1,因此作为byte存储时实际是负数(十进制-107)。
当byte参与整数运算时,Java会自动将其提升为int类型,此时会触发符号位扩展:将byte的最高位(1)填充到int的高24位,导致bytes[0]转成int后的值为0xFFFFFF95,而非你预期的0x00000095。
计算过程验证
你的代码计算逻辑:
int number = bytes[0] + (bytes[1] << 8) + (bytes[2] << 16) + (bytes[3] << 24);
实际运算时各部分的值:
bytes[0]→0xFFFFFF95(十进制-107)bytes[1] << 8→0x00001900(十进制6400)bytes[2] << 16→0x00070000(十进制458752)bytes[3] << 24→0x00000000
相加结果:0xFFFFFF95 + 0x00001900 + 0x00070000 = 0x00071895,和你实际得到的结果一致。
解决方案
通过**按位与0xFF**清除符号扩展带来的高24位,将byte转换为无符号的int值后再参与运算:
int number = (bytes[0] & 0xFF) + ((bytes[1] & 0xFF) << 8) + ((bytes[2] & 0xFF) << 16) + ((bytes[3] & 0xFF) << 24);
此时bytes[0] & 0xFF得到0x00000095,最终计算结果为0x00071995,符合预期。
内容的提问来源于stack exchange,提问作者alin tudose
相关产品推荐
相关产品推荐

