C++ 无符号整数零的位表示
我遇到了一个我没想到会在无符号整数上使用位运算的行为。我就直截了当地讲我的例子C++ 无符号整数零的位表示,c++,bit-manipulation,unsigned,C++,Bit Manipulation,Unsigned,我遇到了一个我没想到会在无符号整数上使用位运算的行为。我就直截了当地讲我的例子 unsigned int a = 0; unsigned int b = 0; std::printf("a & b: %u\n", a & b); std::printf("a == b: %i\n", a == b); std::printf("a & b == a: %i\n", a & b == a); 上述代码生成以下输出: a & b: 0 a == b: 1 a
unsigned int a = 0;
unsigned int b = 0;
std::printf("a & b: %u\n", a & b);
std::printf("a == b: %i\n", a == b);
std::printf("a & b == a: %i\n", a & b == a);
上述代码生成以下输出:
a & b: 0
a == b: 1
a & b == a: 0
最后一行让我困惑。不应该a&b==a
计算为true
,因为a&b==(无符号整数)0
和a==(无符号整数)0
?你应该写:
(a & b) == a
现在您将获得1,因为a&b
:
(a&b)=0
,0==0
为1
在您的案例中,
a&b==a
被评估为a&(b==a)
,b==a
为1,a&1
为0。由于,a&b==a
被评估为a&(b==a)
(而不是您预期的(a&b)==a
).您之所以会出现这种行为,是因为您没有意识到=
出现在中的&
之前。事实上,一个好的编译器会立即警告您的代码:
t.cpp:10:35: warning: & has lower precedence than ==; == will be evaluated first [-Wparentheses]
std::printf("a & b == a: %i\n", a & b == a);
^~~~~~~~
t.cpp:10:35: note: place parentheses around the '==' expression to silence this warning
std::printf("a & b == a: %i\n", a & b == a);
^
( )
t.cpp:10:35: note: place parentheses around the & expression to evaluate it first
std::printf("a & b == a: %i\n", a & b == a);
^
( )
确保您的警告已打开,如g++-Wall-Wextra-Werror
可能重复的警告