有人可以向我解釋爲什麼面具根本沒有向右移動?你可以使用任何東西代替1,結果將是相同的。爲什麼這個按位右移似乎不起作用?
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
有人可以向我解釋爲什麼面具根本沒有向右移動?你可以使用任何東西代替1,結果將是相同的。爲什麼這個按位右移似乎不起作用?
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
這是一個類型問題。如果你投0到無符號,它會被罰款:每評論
unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);
編輯:或使用無符號的文字符號,這是更爲簡潔。 :)
unsigned mask = ~0u >> 1;
printf("%u\n", mask);
發生了什麼事是~0
是(-1
)將所有的位的int。現在你右移1
;因爲它是-1
,符號擴展保持最高位設置,所以它仍然保持簽名(這不是你期望的)。然後它會像您期望的那樣轉換爲無符號。
〜0是一串。 >>運算符對它們進行移位,並在一個有符號的值中將其移入高位。所以你可以換所有你想要的,結果不會改變。
試試這個:
unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);
轉讓的RHS被當作一個符號量,除非你施放它,這意味着你沒有看到劇組符號擴展。 (我也改變了你的打印語句,以十六進制顯示數字,這對我來說更容易解碼。)
或者只是:「unsigned mask =〜0u >> 1;」 u後綴表示一個無符號整數。 – Skizz 2009-02-24 23:09:49