マスクが右にずれることがない理由を誰かが説明できますか?あなたはその1の代わりに何かを使うことができ、結果は同じになります。このビットシフト権はなぜ機能しないように見えるのですか?
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
マスクが右にずれることがない理由を誰かが説明できますか?あなたはその1の代わりに何かを使うことができ、結果は同じになります。このビットシフト権はなぜ機能しないように見えるのですか?
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
これは型の問題です。コメントあたり
unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);
編集:あなたは符号なしに0をキャストする場合、それは大丈夫ですかはるかに簡潔である符号なしのリテラル表記を使用します。 :)
unsigned mask = ~0u >> 1;
printf("%u\n", mask);
何が起こっている~0
で設定されたすべてのビット(-1
)とintです。今すぐ右シフト1
; -1
なので、符号拡張は最高ビットを設定したままにしておきます(これはあなたが期待していたものではありません)。それからあなたは期待どおりに符号なしに変換されます。
〜0は1の文字列です。 >>演算子はそれらをシフトし、符号付きの値で1を高位ビットにシフトします。あなたが望むものをすべてシフトすることができるので、結果は変わらないでしょう。
これを試してください:あなたはそれを唱えない限り
unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);
割り当てのRHSは、あなたはキャストせずに符号拡張を見ていた意味し、署名した量として扱われます。 (私はまた、数字を16進数で表示するように印刷ステートメントを変更しました。デコードが簡単です)
または、単に「符号なしマスク=〜0u >> 1」 u接尾辞は、符号なし整数を表します。 – Skizz
ああ、あまりにも。 – chaos
ビンゴ!暗黙の型キャストが起こっていることに気づいていなかったので、この質問は私にとっては難しいものでした。以前の答えでは、そのビットを明確にすることはできませんでした。 –