作者:有风吹过best | 2023-09-06 12:02
在Java中,没有无符号字节.
使用某些低级代码时,有时需要处理大于128的无符号值的字节,这会导致Java将其解释为负数,因为MSB用于符号.
解决这个问题的好方法是什么?(说不要使用Java不是一个选项)
1> 小智..:
如果你这样做,实际上可以摆脱if语句和添加.
byte[] foobar = ..;
int value = (foobar[10] & 0xff);
这样,Java不会将字节解释为负数,也会将整数上的符号位翻转.
关于效率的小注意事项:当将上述表达式编译为本机机器指令时,Java的热点客户端VM将执行正常的字节到int促销(使用[符号扩展名](https://en.wikipedia.org/wiki/Sign_extension )),然后是AND操作.Hotspot Server VM足够智能,可以在零跳转的情况下进行促销,跳过AND.
2> pauldoo..:
从数组中读取任何单个值时,将其复制为short或int之类的东西,并手动将负数转换为正值.
byte[] foobar = ..;
int value = foobar[10];
if (value < 0) value += 256 // Patch up the 'falsely' negative value
写入数组时可以进行类似的转换.
更容易和更有效地做int值=(foobar [10]&0xFF);
也许,但我希望我的代码尽可能清晰和有启发性.另外,我不知道Java中的负整数有什么'和'(至少没有谷歌搜索),所以我玩得很安全.
我认为也许0xFF会被视为有符号字节(将为-1),然后在作为参数传递给'&'之前将符号扩展为32位有符号整数(这将给出0xFFFFFFFF又为-1).这会产生不正确的结果.从讨论中可以清楚地看出Java不会这样做,但我认为最好安全地发挥它.