按位运算期间整数提升的行为

Joh*_*gen 7 c++ bit-manipulation bitwise-operators integer-promotion

当对小于 的算术类型执行按位运算时int,它会自动提升为int

std::uint8_t a = 42;
auto b = a | 0x0f;
// b will be of type int
Run Code Online (Sandbox Code Playgroud)

我无法确定的是这次促销期间到底发生了什么,特别是因为它正在从无符号整数转换为有符号整数。的数值会a保持一致,可能会改变二进制表示吗?或者二进制表示会保持一致,可能会导致不同的数值?

是否有理由将该值提升为int而不是unsigned int?后者不会引起任何这种混乱。

eer*_*ika 1

当对小于 int 的算术类型执行按位运算时,它会自动提升为 int。

正确1 . 此外,这适用于所有算术运算。不仅仅是按位运算。

a的数值会保持一致吗

是的。

可能会改变二进制表示形式?

有点取决于对二进制表示的期望。每个位将具有与相应原始位相同的值(按照重要性顺序)。但在小端系统上,字节的内存顺序会发生变化。

是否有理由将该值提升为 int

是的。此设计选择在答案中引用的 ANSI C 基本原理中进行了解释。简而言之,这使得价值在所有促销活动中保持一致。


1从技术上讲,它可以在某些系统上在某些条件下提升为 unsigned int。更具体地说,较低级别的整数类型被提升为 int 或 unsigned int。Char 和 Short 的级别低于 int,无论它们更小还是大小相同。当原始值无法用 int 类型表示时,会将其提升为 unsigned int。这可能发生在 unsigned char 和/或 unsigned Short 与 int 大小相同的系统上。