无符号int零的位表示

bit representation of unsigned int zero

本文关键字:表示 int 无符号      更新时间:2023-10-16

我遇到了一种行为,这是我在无符号整数上使用逐位运算时没有想到的。我将直接以我的例子为例。

unsigned int a = 0;
unsigned int b = 0;
std::printf("a & b: %un", a & b);
std::printf("a == b: %in", a == b);
std::printf("a & b == a: %in", a & b == a);

上述代码产生以下输出:

a & b: 0
a == b: 1
a & b == a: 0

最后一行让我困惑。既然a & b == (unsigned int)0a == (unsigned int)0a & b == a不应该求值为true吗?

您之所以会出现这种行为,是因为您没有意识到在C运算符优先级表中==位于&之前。事实上,一个好的编译器会立即警告你的代码:

t.cpp:10:35: warning: & has lower precedence than ==; == will be evaluated first [-Wparentheses]
std::printf("a & b == a: %in", a & b == a);
                                  ^~~~~~~~
t.cpp:10:35: note: place parentheses around the '==' expression to silence this warning
std::printf("a & b == a: %in", a & b == a);
                                  ^
                                    (     )
t.cpp:10:35: note: place parentheses around the & expression to evaluate it first
std::printf("a & b == a: %in", a & b == a);
                                  ^
                                (    )

确保您的警告已打开,如g++ -Wall -Wextra -Werror

您应该写:

(a & b) == a 

现在您将得到1,因为a & b将首先进行评估:

CCD_ 9、CCD_。

在您的情况下,a & b == a计算为a & (b == a)b == a为1,a & 1为0。

由于==的优先级高于&a & b == a被评估为a & (b == a)(而不是您所期望的(a & b) == a)。