You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 16:55:14