无符号8位整数的左移运算

Pankaj Mishra

我试图理解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移位运算符)开始

  1. ...操作数应为整数或无范围枚举类型,并执行整数提升。结果的类型是提升后的左操作数的类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章