int のビットシフト演算をしていたのですが、思い通りにならなくてビックリしました。
int i, res;
i = 0x80000000;
res = i>>1; //results in 0xc0000000
res = (unsigned int) i>>1; //results in 0x40000000
整数のビットのシフトが 31 ビット目までしか機能しないのはどうしてですか?
int のビットシフト演算をしていたのですが、思い通りにならなくてビックリしました。
int i, res;
i = 0x80000000;
res = i>>1; //results in 0xc0000000
res = (unsigned int) i>>1; //results in 0x40000000
整数のビットのシフトが 31 ビット目までしか機能しないのはどうしてですか?
あなたが見ているのは、おそらく算術ビットシフトです。
右にシフトすると、左端のビット (通常、符号付き整数表現の符号ビット) が複製されて、すべての空き位置が埋められます (これは一種の符号拡張です)。
C99 標準6.5.7§5 は次のように述べています。
E1 >> E2 の結果は、E1 を右シフトした E2 ビット位置です。[...] E1 に符号付きの型と負の値がある場合、結果の値は実装定義です。
したがって、結果は、コンパイラの作成者が決定したものになる可能性があります。彼らはおそらく符号ビットを拡張することを決定しました。コンパイラのドキュメントでそれについて言及する必要があります。