[英]bit representation of unsigned int zero
我遇到了我沒想到在無符號int上使用按位運算的行為。 我將以我的榜樣為准。
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 == (unsigned int)0
和a == (unsigned int)0
嗎?
之所以會出現這種現象,是因為您沒有意識到==
在C運算符優先級表中位於&
之前。 實際上,一個好的編譯器會立即警告您有關代碼的信息:
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
。
您應該寫:
(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
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.