为什么按位左移将 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
,随之而来的是回绕。
我对 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
的类型来防止这种情况发生,但是根据上述规则,在这种情况下这不会给您带来任何好处。
(您可以详细了解此过程
结果是你的表达式的结果永远不会是 uint8_t
;只是在 j
的情况下,您将其 返回 转换为 uint8_t
,随之而来的是回绕。