C / C++ 標準(このリンクを参照)によると、C および C++ の >> 演算子は必ずしも符号付き数値の算術シフトではありません。ビットが右にシフトされるときに 0 (論理) または符号ビット (算術) がシフトされるかどうかは、コンパイラの実装次第です。
このコードは、符号付き整数の論理右シフトを実装するコンパイラのコンパイル時に ASSERT (失敗) するように機能しますか?
#define COMPILE_TIME_ASSERT(EXP) \
typedef int CompileTimeAssertType##__LINE__[(EXP) ? 1 : -1]
#define RIGHT_SHIFT_IS_ARITHMETIC \
( (((signed int)-1)>>1) == ((signed int)-1) )
// SHR must be arithmetic to use this code
COMPILE_TIME_ASSERT( RIGHT_SHIFT_IS_ARITHMETIC );