带负数的位运算会导致ub吗?
Do bitwise operations with negative numbers cause ub?
在 C++17 中执行 -1 ^ mask
和其他按位运算(如 signed.bitOp(unsigned)
和 signed.bitOp(signed)
之类的操作是实现定义的还是未定义的行为?
在C++17的各种按位运算之前,两个操作数经过“usual arithmetic conversions”使它们具有相同的类型。根据两种类型的不同,您可以获得有符号或无符号类型。这些转换决定了您是否具有明确定义的行为。
如果“通常的算术转换”导致将负数转换为无符号类型,则触发 [conv.integral]/2,这会导致负数映射到“与源一致的最小无符号整数”整数".
实际操作是……按位。该标准要求实现提供 some 有符号整数的二进制表示。因此,对两个有符号整数的按位运算就是对该二进制表示形式进行按位运算所得到的结果。由于实际表示是实现定义的,因此允许结果根据该表示而变化。但是,由于实现要求带符号表示的正值与相同数字范围内相应的无符号整数的表示相匹配,因此对于存储在带符号整数中的正值,按位运算具有可靠的结果。
结果不是不确定的;你将从他们那里获得价值。但是在不同的实现上结果可能不同。
C++20 标准化了 2 的补码有符号整数表示(因为几乎每个 C++ 编译器都已经这样做了),所以结果在不同的实现中是一致的。
在 C++17 中执行 -1 ^ mask
和其他按位运算(如 signed.bitOp(unsigned)
和 signed.bitOp(signed)
之类的操作是实现定义的还是未定义的行为?
在C++17的各种按位运算之前,两个操作数经过“usual arithmetic conversions”使它们具有相同的类型。根据两种类型的不同,您可以获得有符号或无符号类型。这些转换决定了您是否具有明确定义的行为。
如果“通常的算术转换”导致将负数转换为无符号类型,则触发 [conv.integral]/2,这会导致负数映射到“与源一致的最小无符号整数”整数".
实际操作是……按位。该标准要求实现提供 some 有符号整数的二进制表示。因此,对两个有符号整数的按位运算就是对该二进制表示形式进行按位运算所得到的结果。由于实际表示是实现定义的,因此允许结果根据该表示而变化。但是,由于实现要求带符号表示的正值与相同数字范围内相应的无符号整数的表示相匹配,因此对于存储在带符号整数中的正值,按位运算具有可靠的结果。
结果不是不确定的;你将从他们那里获得价值。但是在不同的实现上结果可能不同。
C++20 标准化了 2 的补码有符号整数表示(因为几乎每个 C++ 编译器都已经这样做了),所以结果在不同的实现中是一致的。