【发布时间】:2021-08-29 20:36:17
【问题描述】:
我正在实现一个库,它在后台使用了许多位技巧。要求之一是有符号整数右移是算术的。
“负符号整数的右位移”是否用零或一填充空白左侧是实现定义的 - 但我如何在编译期间检查它是哪一个?
我的一个想法是:
static_assert( ((int32_t{-1}) >> 31) == -1, "");
static_assert( ((int64_t{-1}) >> 63) == -1, "");
但是我能确定,这个操作在编译时和运行时都会以同样的方式执行吗?有没有更好的方法来检查?
【问题讨论】:
-
行为由 C++20 标准定义为算术,用一个填充 - 但我也需要一个适用于以前标准的答案。
-
有几个类似的问题。 This one 非常接近,尽管我不确定答案中的一些建议。