Java中如何将short转为int且不出现负数?字节转int保留位模式咨询
Java字节转int时保留位模式的解决方案
在开发文件读取器处理short类型数据时,会遇到一个问题:Java将byte转换为int执行位运算时,会通过符号扩展保留原有数值,而非原字节的位模式,导致运算结果不符合预期。
当前问题示例
byte number = -1; // 二进制为 11111111,数值为-1 int otherNumber = 1; System.out.println(number | otherNumber); // 输出-1,不符合预期
这里byte的-1转int时,高24位被填充为1,变成32位的11111111 11111111 11111111 11111111(数值-1),和1做或运算后结果还是-1。
修正后的代码(符合期望效果)
byte number = -1; int otherNumber = 1; System.out.println((number & 0xFF) | otherNumber); // 输出129
解决方案原理
用& 0xFF操作可以屏蔽符号扩展带来的高位1:
- Java的byte是有符号类型,负数的最高位为1,转int时会把高24位都设为1以保留数值
0xFF是十六进制的00000000 00000000 00000000 11111111,和byte转int后的数值做按位与,会把高24位强制置为0,只保留原byte的8位位模式,得到对应无符号的int值
扩展:组合两个byte为short
如果是用两个byte拼接成short,同样需要处理符号扩展:
byte highByte = ...; // 高字节 byte lowByte = ...; // 低字节 short shortValue = (short) (((highByte & 0xFF) << 8) | (lowByte & 0xFF));
先把每个byte转成无符号的int,再移位拼接,最后转成short,就能得到正确的位模式。
内容的提问来源于stack exchange,提问作者BREgitLEEhub2222
相关产品推荐
相关产品推荐

