【问题标题】:How to check at compile time if signed integer bit-shift is arithmetic?如果有符号整数位移是算术的,如何在编译时检查?
【发布时间】:2021-08-29 20:36:17
【问题描述】:

我正在实现一个库,它在后台使用了许多位技巧。要求之一是有符号整数右移是算术的。

“负符号整数的右位移”是否用零或一填充空白左侧是实现定义的 - 但我如何在编译期间检查它是哪一个?

我的一个想法是:

static_assert( ((int32_t{-1}) >> 31) == -1, "");
static_assert( ((int64_t{-1}) >> 63) == -1, "");

但是我能确定,这个操作在编译时和运行时都会以同样的方式执行吗?有没有更好的方法来检查?

【问题讨论】:

  • 行为由 C++20 标准定义为算术,用一个填充 - 但我也需要一个适用于以前标准的答案。
  • 有几个类似的问题。 This one 非常接近,尽管我不确定答案中的一些建议。

标签: c++ bit-shift


【解决方案1】:

这正是静态断言的意义所在,因此您的第一个想法可能是最好的。我相信static_assert() 应该确保它在运行时也能正常工作,但是如果你想进行运行时检查以确保,assert() 的工作方式相同,但在运行时进行检查,我会把它放在您的主要功能的开始只做一次检查。

建议:我实际上会在static_assert 中添加一条错误消息,例如static_assert( ((int32_t{-1}) >> 31) == -1, "int32_t Right Shift Is Not Arithmetic");,因此如果您曾经为右移的不同实现进行编译,您就会知道错误是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 2021-07-30
    • 2013-10-28
    相关资源
    最近更新 更多