负数的按位运算会导致 ub 吗?

Posted

技术标签:

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

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

【问题讨论】:

之前定义过:***.com/questions/14326900/… @orhtej2 是否在 ISO 中保证符号位就在数字之前/无论如何? 公平的问题,看起来没有:***.com/questions/37363367/… 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于负数的按位运算会导致 ub 吗?的主要内容,如果未能解决你的问题,请参考以下文章

开发人员应该了解哪些有用的按位运算符代码技巧? [关闭]

python-opencv-图像的按位运算

c语言的按位运算符怎么操作!?

大位向量的按位运算

Apache Pig 中的按位运算?

非数字的按位运算