C++ 对无符号8位整数的左移位操作

C++ 对无符号8位整数的左移位操作,c++,bit-manipulation,bit-shift,integer-promotion,C++,Bit Manipulation,Bit Shift,Integer Promotion,我试图理解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:

我试图理解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
<>从C++标准8.8移位运算符< /P> ... 操作数应为整数或无范围枚举类型,且 执行整体促销。结果的类型是 提升后的左操作数。
如果我错了,请纠正我,操作数16是32位的整数,假设整数是32位的,因此,当使用xor 8位应用它时,它会将其提升为32位,最后,结果是int32位类型。我说的对吗?@PankajMishra看到我的最新帖子了。现在很清楚了。谢谢向上投票。
#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