2009-02-24 99 views

回答

25

這是一個類型問題。如果你投0到無符號,它會被罰款:每評論

unsigned mask = ~ (unsigned) 0 >> 1; 
printf("%u\n", mask); 

編輯:或使用無符號的文字符號,這是更爲簡潔。 :)

unsigned mask = ~0u >> 1; 
printf("%u\n", mask); 
+2

或者只是:「unsigned mask =〜0u >> 1;」 u後綴表示一個無符號整數。 – Skizz 2009-02-24 23:09:49

13

Sign extension

發生了什麼事是~0是(-1)將所有的位的int。現在你右移1;因爲它是-1,符號擴展保持最高位設置,所以它仍然保持簽名(這不是你期望的)。然後它會像您期望的那樣轉換爲無符號。

2

〜0是一串。 >>運算符對它們進行移位,並在一個有符號的值中將其移入高位。所以你可以換所有你想要的,結果不會改變。

4

試試這個:

unsigned mask = (unsigned) ~0 >> 1; 
printf("%08x\n", mask); 

轉讓的RHS被當作一個符號量,除非你施放它,這意味着你沒有看到劇組符號擴展。 (我也改變了你的打印語句,以十六進制顯示數字,這對我來說更容易解碼。)