我试图理解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移位运算符)开始
- ...操作数应为整数或无范围枚举类型,并执行整数提升。结果的类型是提升后的左操作数的类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句