我试图理解 C/C++ 中的移位运算符,但它们给我带来了困难。
我有一个无符号 8 位整数,初始化为一个值,例如 1。
uint8_t x = 1;
根据我的理解,它在内存中的表示方式如下|0|0|0|0|0||0||0||1|
。现在,当我尝试将变量 x 保留 16 位时,我希望得到输出0。但令我惊讶的是,我得到了65536
。我当然错过了一些我无法得到的东西。
这是我的代码:
#include <iostream>
int main() {
uint8_t x = 1;
std::cout<<(x<<16)<<"\n";
return 0;
}
这是一个天真的问题,但却让我很困扰。
在这个表达式中
x<<16
整数提升适用于两个操作数。所以表达式的结果是一个int类型的对象。
尝试以下演示程序
#include <iostream>
#include <iomanip>
#include <type_traits>
#include <cstdint>
int main()
{
uint8_t x = 1;
std::cout << std::boolalpha << std::is_same<int, decltype( x<<16 )>::value << '\b';
return 0;
}
它的输出是
true
来自 C++ 标准(8.8 移位运算符)
- ...操作数应为整数或无范围枚举类型,并且
进行积分促销。结果的类型是
提升的左操作数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)