【问题标题】:Do bitwise operations with negative numbers cause ub?负数的按位运算会导致 ub 吗?
【发布时间】:2022-01-15 05:15:07
【问题描述】:

在 C++17 中执行 -1 ^ mask 和其他按位运算(如 signed.bitOp(unsigned)signed.bitOp(signed))是实现定义的行为还是未定义的行为?

【问题讨论】:

标签: c++ c++17 bit-manipulation


【解决方案1】:

在C++17的各种按位运算之前,两个操作数经过“usual arithmetic conversions”,使它们具有相同的类型。根据这两种类型的不同,您可以获得有符号或无符号类型。这些转化决定了你是否有明确定义的行为。

如果“通常的算术转换”导致负数转换为无符号类型,则触发[conv.integral]/2,这会导致将负数映射到“与源整数一致的最小无符号整数”。

实际操作是……按位。该标准要求实现提供有符号整数的一些二进制表示。因此,对两个有符号整数的按位运算就是对二进制表示进行按位运算得到的结果。由于实际表示是实现定义的,因此允许结果根据该表示而变化。但是,由于实现要求有符号表示的正值与相同范围的数字对应的无符号整数表示相匹配,因此对于存储在有符号整数中的正值,按位运算具有可靠的结果。

结果不是未定义的;你会从他们那里得到一个价值。但是在不同的实现上结果可能会有所不同。

C++20 标准化了 2 的补码有符号整数表示(因为几乎每个 C++ 编译器都已经这样做了),因此结果在实现之间是一致的。

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多