次の効果は何ですか?
unsigned int x = -1; x >>= 2;
x が負の数であり、型が符号なしであるため、x が何に設定されるのかよくわかりませんか?
unsigned int x = -1;
(セクション 6.3.1.3、ポイント 2)¹ に設定x
します。-1 は の初期化のために に変換さUINT_MAX
れます。その変換は、ここで一度、範囲内になるまで値に加算 (またはここではなく減算) することによって行われます。int
unsigned int
x
UINT_MAX +1
0 .. UINT_MAX
したがって、符号なし整数のビットごとの右シフトはセクション 6.5.7 のポイント 5 で指定されているため、 にx >>= 2;
設定x
されます。UINT_MAX/4
の結果
E1 >> E2
はE1
右シフトされたE2
ビット位置です。符号なし型の場合E1
、または符号付き型E1
で負でない値の場合、結果の値は E1 / 2 E2の商の整数部分です。
¹「それ以外の場合、新しい型が符号なしの場合、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算することによって、値が変換されます。」
-1 は、unsigned int を 0xffffffff に設定する必要があります。これは、その型の最大数 (約 48 億) です。int が 32 ビットを超える場合は、それよりもはるかに高くなります。
これは、符号付きの負の値で初期化された符号なしの型です。シフトは、符号なしの値に対しても実行されます。