我编写了以下代码,但findbugs正在回答这个错误:BIT_ADD_OF_SIGNED_BYTE
。我尝试了很多,但可能是我没有正确地得到左移的概念。
void problem() {
byte [] byteArray = {1, 2, 3, 4, 5};
int localOne = 0;
for(int i = 0; i < 4; i++) {
localOne = (localOne<<8) + byteArray[i];
}
}
答案 0 :(得分:2)
您正确地进行了转换,将byte
添加到int
由于符号扩展,您需要执行此操作:
localOne = (localOne<<8) + (0xFF & byteArray[i]);
假设您有80
(十六进制)字节,即1000 0000
(二进制),这是-128
(十进制),因为两个补码表示。现在,将其添加到int
时,它首先会转换为int
。生成的int
不是
0000 0000 0000 0000 0000 0000 1000 0000
(二进制)它将是
1111 1111 1111 1111 1111 1111 1000 0000
(二进制)因为符号扩展。要获得第一个,你必须按位并应用0xFF
这是二进制的:
0000 0000 0000 0000 0000 0000 1111 1111