10

マスクがまったく右にシフトしない理由を誰かに説明してもらえますか? その 1 の代わりに何でも使用でき、結果は同じになります。

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

4 に答える 4

26

タイプの問題です。0 を unsigned にキャストすると問題ありません。

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

コメントごとに編集: または、より簡潔な符号なしリテラル表記を使用します。:)

unsigned mask = ~0u >> 1;
printf("%u\n", mask);
于 2009-02-24T23:04:31.910 に答える
13

サインエクステンション

起こっているの~0は、すべてのビットが設定された int ( -1) です。1;で右にシフトします。であるため-1、符号拡張は最上位ビット セットを保持するため、符号付きのままになります (これは予期していたものではありません)。次に、期待どおりに unsigned に変換されます。

于 2009-02-24T23:02:06.927 に答える
4

これを試して:

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

割り当ての RHS は、キャストしない限り符号付き数量として扱われます。つまり、キャストなしで符号拡張が表示されていました。(また、print ステートメントを変更して、数値を 16 進数で表示するようにしました。これにより、デコードが容易になります。)

于 2009-02-24T23:05:05.187 に答える
2

~0 は 1 の文字列です。>> 演算子はそれらをシフトし、符号付きの値では、1 を上位ビットにシフトします。したがって、必要なだけシフトできますが、結果は変わりません。

于 2009-02-24T23:03:43.537 に答える