マスクがまったく右にシフトしない理由を誰かに説明してもらえますか? その 1 の代わりに何でも使用でき、結果は同じになります。
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
マスクがまったく右にシフトしない理由を誰かに説明してもらえますか? その 1 の代わりに何でも使用でき、結果は同じになります。
unsigned mask = ~0 >> 1;
printf("%u\n", mask);
タイプの問題です。0 を unsigned にキャストすると問題ありません。
unsigned mask = ~ (unsigned) 0 >> 1;
printf("%u\n", mask);
コメントごとに編集: または、より簡潔な符号なしリテラル表記を使用します。:)
unsigned mask = ~0u >> 1;
printf("%u\n", mask);
起こっているの~0
は、すべてのビットが設定された int ( -1
) です。1
;で右にシフトします。であるため-1
、符号拡張は最上位ビット セットを保持するため、符号付きのままになります (これは予期していたものではありません)。次に、期待どおりに unsigned に変換されます。
これを試して:
unsigned mask = (unsigned) ~0 >> 1;
printf("%08x\n", mask);
割り当ての RHS は、キャストしない限り符号付き数量として扱われます。つまり、キャストなしで符号拡張が表示されていました。(また、print ステートメントを変更して、数値を 16 進数で表示するようにしました。これにより、デコードが容易になります。)
~0 は 1 の文字列です。>> 演算子はそれらをシフトし、符号付きの値では、1 を上位ビットにシフトします。したがって、必要なだけシフトできますが、結果は変わりません。