【问题标题】:Why does bitwise left shift promotes an uint8_t to a wider type [duplicate]为什么按位左移将 uint8_t 提升为更广泛的类型[重复]
【发布时间】:2019-08-22 12:22:38
【问题描述】:

我对@9​​87654328@ 有点乱七八糟,很好奇当我将位流出到左侧并发现时会发生什么

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

似乎&lt;&lt; 确实提升了uint8_t 一些更广泛的整数类型。为什么会这样?

Here 一个你可以看到它的链接

【问题讨论】:

标签: c++ bit-shift uint8t


【解决方案1】:

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

这可以追溯到几十年前。

首先,进行积分促销。

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

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

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

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

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

【讨论】:

  • 更准确地说是通常的算术转换。
  • 这似乎没有解决问题Try it online!
  • @Ackdari 哦,是的 - 好的,请参阅编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多