0

我编写了以下代码,但 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]; 
    }
}
4

1 回答 1

2

您正确地进行了轮班,您的(可能的)错误是在将签名添加byteint

由于符号扩展,您需要这样做:

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
于 2012-12-20T10:07:48.637 回答