按位取反需避免由类型提升产生的多余数据
10.2.11 ID_suspiciousPromotion
8 位或 16 位整数按位取反时会被提升为 int 等类型,可能会产生非预期的多余数据。
示例:
uint8_t a = 0xCD;
uint8_t b = (~a) >> 4; // Rather suspicious, ‘b’ is 0xF3
经“类型提升”,例中 ~a 在 16 位环境中为 0xFF32,在 32 位环境中为 0xFFFFFF32,高位的数据很可能是多余的。
应在取反后立即转为目标类型:
uint8_t a = 0xCD;
uint8_t b = uint8_t(~a) >> 4; // OK, ‘b’ is 0x03
参考
MISRA C++ 2008 5-0-10