我正在处理一个函数,我必须转换一个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;
我需要功能但不想要警告。我如何压制它?
答案 0 :(得分:2)
您可以使用位移替换乘法,或者甚至手动计算位模式以获得更好的可读性:
const int32 bMSBNeg = (int32)0xFF000000;
你也可以通过在高三个字节中构造数字,然后用除法将它向下移8位来避免所有这些计算:
if (pbData != NULL) {
i32Num = ((pbData[0] << 24) | (pbData[1] << 16) | (pbData[2] << 8)) / 256;
}
注意:按8而不是除以256将是根据标准实现定义的行为。