Cでは、32ビットマシンで、与えられた1>>31
戻り値が符号付き整数であるかどうか疑問に思っていました.2の補数の場合、右シフト(算術)を実行しているときに符号ビットがコピーされ、結果が得られます-1
1
1111 1111 1111 1111 1111 1111 1111 1111
Cでは、32ビットマシンで、与えられた1>>31
戻り値が符号付き整数であるかどうか疑問に思っていました.2の補数の場合、右シフト(算術)を実行しているときに符号ビットがコピーされ、結果が得られます-1
1
1111 1111 1111 1111 1111 1111 1111 1111
いいえ、適合する実装では結果はゼロになります。
C99、6.5.7/5 (「ビット単位のシフト演算子」) は次のように述べています。
E1 >> E2 の結果は、E1 を右シフトした E2 ビット位置です。E1 が unsigned 型の場合、または E1 が signed 型で負でない値の場合、結果の値は E1 / 2^E2 の商の整数部分です。E1 に符号付きの型と負の値がある場合、結果の値は実装定義です。
は非負であるため、結果は明らかにゼロである1
積分商になります。1 / (2^31)
符号ビット (最上位ビット) は整数 1 に対して 0 であるため、結果はゼロになります。
0000 0000 0000 0000 0000 0000 0000 0001
^
1の符号ビットが0であるため、の結果1>>31
はゼロです。
ただし、K&R Second Editionによると、結果は符号付きの値の右シフトに対して実装定義されているため、複製される符号ビットを信頼することはできません。