预先警告:“算术溢出:转换32位值,然后转换为64位值。”

时间:2019-03-08 10:55:05

标签: c prefast

我已经声明了这样的宏:

#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位值。结果可能不是预期值。

该如何解决?

1 个答案:

答案 0 :(得分:0)

这很不解。如果P的值大于7(7 * 4 = 28,最大值为31),则F_MASK_4_BIT << (P * 4)将溢出。因为F_MASK_4_BIT是类型int的整数常量。

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

#define F_MASK_4_BIT 0xFull