簡體   English   中英

無符號int零的位表示形式

[英]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)0a == (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM