2009-02-24 11 views

答えて

25

これは型の問題です。コメントあたり

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

編集:あなたは符号なしに0をキャストする場合、それは大丈夫ですかはるかに簡潔である符号なしのリテラル表記を使用します。 :)

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

または、単に「符号なしマスク=〜0u >> 1」 u接尾辞は、符号なし整数を表します。 – Skizz

+0

ああ、あまりにも。 – chaos

+1

ビンゴ!暗黙の型キャストが起こっていることに気づいていなかったので、この質問は私にとっては難しいものでした。以前の答えでは、そのビットを明確にすることはできませんでした。 –

13

Sign extension

何が起こっている~0で設定されたすべてのビット(-1)とintです。今すぐ右シフト1; -1なので、符号拡張は最高ビットを設定したままにしておきます(これはあなたが期待していたものではありません)。それからあなたは期待どおりに符号なしに変換されます。

2

〜0は1の文字列です。 >>演算子はそれらをシフトし、符号付きの値で1を高位ビットにシフトします。あなたが望むものをすべてシフトすることができるので、結果は変わらないでしょう。

4

これを試してください:あなたはそれを唱えない限り

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

割り当てのRHSは、あなたはキャストせずに符号拡張を見ていた意味し、署名した量として扱われます。 (私はまた、数字を16進数で表示するように印刷ステートメントを変更しました。デコードが簡単です)

関連する問題