在Java中,我有以下代码:
byte lo = 0x88;
byte hi = 0x0;
short x = 0;
x |= lo;
x |= (short) ((short) hi << 8); // FIXME double cast ??
return x;
第一次操作后,short中的值为0xff88
。我理解这是因为Java不支持无符号数字。
我如何强迫它忽略标志?我没有直接在Java代码中使用这些数据,所以它没关系,对吧?
答案 0 :(得分:0)
在执行按位运算之前将字节转换为int时,符号出现。转换必须签名扩展byte
值,因为byte
是Java中的签名类型。必须进行转换,因为按位操作是对int
值或long
值的操作。
有两种解决方案:
在转换为int
之后或执行按位OR之后屏蔽顶部位; e.g。
x |= (lo & 0xff);
x |= (hi & 0xff) << 8;
(事实证明,hi
...不需要屏蔽......因为你以后会做什么。但是,JIT编译器很可能会优化掉任何不必要的屏蔽指令。如果它没有' t,开销很小,不太重要。)
使用Byte.toUnsignedInt(byte)
将byte
转换为int
。