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?后者不会引起任何这种混乱。
当对小于 int 的算术类型执行按位运算时,它会自动提升为 int。
正确1 . 此外,这适用于所有算术运算。不仅仅是按位运算。
a的数值会保持一致吗
是的。
可能会改变二进制表示形式?
有点取决于您对二进制表示的期望。每个位将具有与相应原始位相同的值(按照重要性顺序)。但在小端系统上,字节的内存顺序会发生变化。
是否有理由将该值提升为 int
是的。此设计选择在本答案中引用的 ANSI C 基本原理中进行了解释。简而言之,这使得价值在所有促销活动中保持一致。
1从技术上讲,它可以在某些系统上在某些条件下提升为 unsigned int。更具体地说,较低级别的整数类型被提升为 int 或 unsigned int。Char 和 Short 的级别低于 int,无论它们更小还是大小相同。当原始值无法用 int 类型表示时,会将其提升为 unsigned int。这可能发生在 unsigned char 和/或 unsigned Short 与 int 大小相同的系统上。