根据 C/C++ 标准 (参见此链接),在 C 和 C++ 中,>> 操作符对于有符号数字不一定是算术移位。具体是否将 0 填充(逻辑移位)或符号位填充(算术移位)由编译器实现决定。
对于实现对有符号整数进行逻辑右移的编译器,这段代码能否在编译时断言(失败)?
#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 );