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

Ack*_*ari 3 c++ bit-shift uint8t

我有点搞砸了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;
Run Code Online (Sandbox Code Playgroud)

打印出来

212
468
Run Code Online (Sandbox Code Playgroud)

而不是预期的

212
212
Run Code Online (Sandbox Code Playgroud)

似乎<<确实促进了uint8_t一些更广泛的整数类型。它为什么这样做?

是一个链接,您可以在其中看到它的实际效果

Lig*_*ica 5

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

这可以追溯到几十年前。

首先,进行积分促销。

  • 没有算术运算,uint8_t所以你的两个操作数总是会被提升。

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

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

(您可以在此处此处了解有关此过程的更多信息。)

结果是你的表达式的结果永远不会是uint8_t; 它只是在的情况下,j你已经将它转换uint8_t,与环绕该结果随之而来。