为什么按位左移将 uint8_t 提升为更宽的类型

Why does bitwise left shift promotes an uint8_t to a wider type

我对 uint8_t 有点胡思乱想,很好奇当我向左流出位并发现

时会发生什么
uint8_t i = 234;

uint8_t j = (i << 1);
auto    k = (i << 1);

std::cout << (int)j << std::endl;

std::cout << k << std::endl;

打印出来

212
468

而不是预期的

212
212

似乎 << 也提升了 uint8_t 一些更宽的整数类型。为什么要这样做?

Here一个link你看到的地方

几乎每个算术运算都执行所谓的常规算术转换

这可以追溯到几十年前。

首先进行积分促销。

  • 没有算术运算需要 uint8_t,因此您的两个操作数将始终被提升。

之后,找到通用类型并在必要时进行转换。

  • 您可以通过将右侧强制转换为 i 的类型来防止这种情况发生,但是根据上述规则,在这种情况下这不会给您带来任何好处。

(您可以详细了解此过程 and here。)

结果是你的表达式的结果永远不会是 uint8_t;只是在 j 的情况下,您将其 返回 转换为 uint8_t,随之而来的是回绕。