C 为什么使用位掩码0x30000会产生与使用0x3不同的结果<&书信电报;16?

C 为什么使用位掩码0x30000会产生与使用0x3不同的结果<&书信电报;16?,c,C,今天我写了一个程序,但有点问题,所以我做了这个测试程序。嗯,0x30000等于0x3你只是被宏是文本替换的事实击中了,这就是它们 这: 将被编译器视为: num &= ~0x3 << 16; 如果不将宏括在括号内,就不能将其定义为表达式,因为您不知道宏将如何使用。我想您忘记了括号:试试看 #define MASK2 (0x3 << 16) #定义MASK2(0x3,因为~的优先级高于的可能副本 num &= ~MASK2; num &= ~0

今天我写了一个程序,但有点问题,所以我做了这个测试程序。嗯,
0x30000
等于
0x3你只是被宏是文本替换的事实击中了,这就是它们

这:

将被编译器视为:

num &= ~0x3 << 16;

如果不将宏括在括号内,就不能将其定义为表达式,因为您不知道宏将如何使用。

我想您忘记了括号:试试看

#define MASK2 (0x3 << 16)

#定义MASK2(0x3,因为
~
的优先级高于
的可能副本
num &= ~MASK2;
num &= ~0x3 << 16;
#define MASK2 (0x3 << 16)
#define MASK2 (0x3 << 16)
~0x3<<16
~MASK2
(~0x3)<<16
~(0x3<<16)
0x30000 == 0x3<<16
~0x30000 == ~0x3<<16 // FALSE -> ~0x3<<16 = (~0x3)<<16