0

我已经声明了这样的宏:

#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);

其中Euint64_t数据类型 Puint8_t 数据类型

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

如何解决这个问题?

4

1 回答 1

0

这很不言自明。如果P有任何大于7(7*4=28, max is 31) 的值,F_MASK_4_BIT << (P * 4)就会溢出。因为F_MASK_4_BIT是类型的整数常量int

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

#define F_MASK_4_BIT 0xFull
于 2019-03-08T11:26:46.850 回答