首页 > 解决方案 > 按位运算期间整数提升的行为

问题描述

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

std::uint8_t a = 42;
auto b = a | 0x0f;
// b will be of type int

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

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

标签: c++bit-manipulationbitwise-operatorsinteger-promotion

解决方案


整数在提升后具有相同的值。提升的类型首先必须能够存储源类型的所有值(可能更多)才能做到这一点。特别是,这意味着一个无符号值在提升后永远不会变成负数,如果 anint太小,提升的类型可能是unsigned int。但请注意,它总是std::uint8_t会提升为int,因为它总是足够大。

当整数提升发生在有符号整数上时,负值的“二进制表示”将被符号扩展(更多 1)。例如,用std::int8_t a = -1;, a & 0b100000000 != 0, 即使二进制表示只是0b11111111. 但这不会发生在无符号值或有符号正值上。

对象表示(当您 memcpy 到 char 数组时)可能会在提升后发生变化。这在有符号的情况下很容易看到,但在无符号的情况下,由于字节顺序,字节的顺序可能不同。


推荐阅读