C++按位运算问题:标志位MS中0x10误判为存在的排查需求
宏定义运算符优先级导致按位与判断不符合预期的问题
你的问题根源在于宏定义的文本替换特性和运算符优先级的冲突:
- 你定义的
#define MS 0x0100|0x011在预编译阶段会直接做文本替换,当你写MS & 0x10时,实际展开后的代码是:0x0100 | 0x011 & 0x10 - C语言中,按位与(
&)的优先级高于按位或(|),所以会先计算0x011 & 0x10:
0x011的二进制是00010001,0x10是00010000,按位与结果为00010000(即0x10)。 - 再计算
0x0100 | 0x10,结果为0x0110(非零值),所以判断会返回真值。
解决方案
给宏定义的表达式加上括号,确保按位或运算先执行:
#define MS (0x0100 | 0x011)
这样MS & 0x10展开后会变成:
(0x0100 | 0x011) & 0x10
先计算括号内的0x0100 | 0x011得到0x0111(二进制100010001),再和0x10(二进制00010000)按位与,结果为0,判断就会返回假,符合你的需求。
内容的提问来源于stack exchange,提问作者user20229169
相关产品推荐
相关产品推荐

