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

可能重复的警告