我已经声明了这样的宏:

#define F_MASK_4_BIT 0xF
#define GET_F_4BIT_MASK(F, P) (((F) & (F_MASK_4_BIT << (P * 4))) >> (4 * P))


使用这样的宏:

uint8_t Feature = GET_F_4BIT_MASK(E, P);


其中E是uint64_t数据类型
          P是uint8_t数据类型

通过Prefast发出警告:C6297:算术溢出:转换32位值,然后转换为64位值。结果可能不是预期值。

如何解决?

最佳答案

这是不言自明的。如果P的任何值大于7(7 * 4 = 28,最大值为31),则F_MASK_4_BIT << (P * 4)将溢出。因为F_MASK_4_BITint类型的整数常量。

通过对整数常量使用适当的类型来解决此问题:

#define F_MASK_4_BIT 0xFull

关于c - 预先警告:“算术溢出:转换32位值,然后转换为64位值。”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55061707/

10-11 19:44