验证C/C++符号右移是否是特定编译器的算法?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

这个代码函数会在编译时断言(失败)用于为有符号整数实现逻辑右移的编译器吗?

#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 );
提问于
用户回答回答于

尝试运行下这个:

template <typename Number>
inline Number shift_logical_right(Number value, size_t bits)
{
    static const bool shift_is_arithmetic = (Number(-1) >> 1) == Number(-1);
    const bool negative = value < 0;
    value >>= bits;
    if (!shift_is_arithmetic && negative) // sign extend
        value |= -(Number(1) << (sizeof(Number) * 8 - bits));
}

或者使用

static_assert((Number(-1) >> 1) == Number(-1), "Arithmetic shift unsupported.");
用户回答回答于

也可以设置编译器发出一个程序集文件(或者在调试器中加载编译好的程序)并查看它发出的操作码signed int i; i >> 1;

扫码关注云+社区