我编写了以下代码,但 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];
}
}
您正确地进行了轮班,您的(可能的)错误是在将签名添加byte
到int
由于符号扩展,您需要这样做:
localOne = (localOne<<8) + (0xFF & byteArray[i]);
假设您有字节80
(十六进制),即1000 0000
(二进制),这是-128
(十进制),因为二进制补码表示。现在,当将其添加到 an 时,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