我想知道在编译时对有符号类型(例如是否-2 >> 1
为)进行操作时检查右移是否是算术的最便携的方法是什么。-1
我的想法是在编译时以某种方式检查这一点并能够检测到这一点,这样我就可以编译不同版本的函数(取决于运算符>>
是否真的是算术移位)。
通过阅读主题 验证 C/C++ 签名右移是否是特定编译器的算术?我想到了初始化一个标志的想法
static const bool is_arithmetic_rs = (((signed int)-1)>>1) == ((signed int)-1));
并像这样在运行时对其进行测试:
if (is_arithmetic_rs) {
// some fast algorithm using arithmetic right shifts (using >> operator)
} else {
// the same algorithm without arithmetic right shifts (much slower)
}
但是,如果可能的话,我想每次都避免这种分支。为简单起见,假设我想实现一个可移植的算术右移;如果我必须在每次调用函数时都检查它,这将对性能产生巨大影响,所以如果可能的话,我想在编译时进行检查。
如果不存在进行此检查的可移植方法,是否有办法通过尽最大努力检查来做到这一点,例如使用 ifdefs 检查特定编译器/平台?