【发布时间】:2017-07-21 09:39:04
【问题描述】:
我正在处理一个函数,我必须转换一个 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:运算常数计算溢出:“乘法”
我需要该功能但不想要警告。如何抑制它?
【问题讨论】:
-
在
0x1000000常量上使用UL后缀 -
如果你把乘法作为对应的移位,那有意义吗?请记住,您使用的是
int,它是一个 signed 32 位类型(在大多数平台上)。 -
一般提示:使用位时,始终使用显式无符号数据类型。
-
@Someprogrammerdude 在这种情况下,在某些情况下希望返回负值,所以这并不简单
-
@M.M 我仍然建议使用无符号类型进行实际的位处理,然后在需要时将其转换为有符号类型。