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

时间:2019-08-22 12:22:38

标签: 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;

打印出

212
468

不是预期的

212
212

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

Here链接,您可以在其中查看其运行情况

1 个答案:

答案 0 :(得分:3)

几乎所有的算术运算都执行通常的算术转换

这可以追溯到几十年前。

首先,进行整体促销。

  • 没有算术运算会占用uint8_t,因此两个操作数将始终被提升。

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

  • 您可以通过将右侧的类型强制转换为i来防止这种情况,但是根据上述规则,在这种情况下您什么都不会得到。

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

结果是表达式的结果永远不会是uint8_t;只是对于j,您已将其 back 强制转换为uint8_t,并随之产生环绕。