我已经声明了这样的宏:
#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位值。结果可能不是预期值。
该如何解决?
答案 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