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

标签 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一个链接,您可以在其中看到它的运行情况

最佳答案

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

这可以追溯到几十年前。

首先,进行积分促销。

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

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

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

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

结果是您的表达式的结果永远不会是 uint8_t;只是在 j 的情况下,您将其返回 转换为 uint8_t,随后发生环绕。

关于c++ - 为什么按位左移将 uint8_t 提升为更宽的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57609263/

相关文章:

c++ - 什么决定了文件列出的顺序?

java - 我可以使用每次迭代移动 1 个新位的 for 循环来获取 Java 中的某个 8 位数字吗?

java - 如何在Java中使用bitshift切换整数标志?

go - 这个位移位在这个例子中是如何工作的?

python - 将 python int 解析为 Mysql unsigned TINYINT

arrays - 将字符串转换为 UTF 8

c++ - 指针在发布版本中丢失

c++ - 是首先调用 init 部分函数还是构造函数?

c++ - OpenCV SURF 功能未实现

将 char 数组中的十六进制地址转换为 uint8_t