设置最重要的符号位(Lint警告)

时间:2017-07-21 09:39:05

标签: c lint

我正在处理一个函数,我必须转换一个3字节数组并将3字节数组作为单个int32返回。 代码如下: pbData是指向字节数组的指针。

const byte bMSBitPosNeg = 0x80;
const byte bMSBNeg = 0xFF;
int32 i32Num = 0;

//Big - Endian
if (pbData != NULL)
{
    if ((pbData[0] & bMSBitPosNeg) == bMSBitPosNeg) //Negative
    {
        i32Num |= (bMSBNeg * 0x1000000); //Force MSB to 0xFF as 3 bytes are 
                                        //converted to 4 bytes
    }

    i32Num |= (pbData[0] << 16);
    i32Num |= (pbData[1] << 8);
    i32Num |= (pbData[2]);

}
return i32Num;

输入:{0x00,0xBB,0xA3} 输出:48035 //正数

输入:{0xff,0x44,0x5d} 输出:-48035 //负数

代码按预期工作,但我得到一个lint警告。 警告648:计算操作溢出溢出:&#39;乘法&#39;

我需要功能但不想要警告。我如何压制它?

1 个答案:

答案 0 :(得分:2)

您可以使用位移替换乘法,或者甚至手动计算位模式以获得更好的可读性:

const int32 bMSBNeg = (int32)0xFF000000;

你也可以通过在高三个字节中构造数字,然后用除法将它向下移8位来避免所有这些计算:

if (pbData != NULL) {
    i32Num = ((pbData[0] << 24) | (pbData[1] << 16) | (pbData[2] << 8)) / 256;
}

注意:按8而不是除以256将是根据标准实现定义的行为。