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

4

我试图理解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;
}

这是一个天真的问题,但它一直困扰着我。

1个回答

6
在这个表达式中。
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. ……操作数应为整数或未作用域的枚举类型,并执行整数提升。结果的类型是促进左操作数的类型。

请纠正我如果我错了,操作数16是32位整数(假设整数为32位),所以当它与x(或8位)应用时,它会将其提升为32位,并且最终结果的类型为int(32位)。我是对的吗? - Pankaj Mishra
@PankajMishra 请查看我的更新帖子。 - Vlad from Moscow
非常清晰,谢谢。已点赞。 - Pankaj Mishra
奇怪的是,如果你有这样的代码:unsigned char value = 255; unsigned char shiftAmount = 24; printf("%d ", (value << shiftAmount) ); 你会得到-16777216作为输出(而不是0)。 - bobobobo
@bobobobo 移位表达式的操作数被提升为 int 类型。因此,符号位被设置。 - Vlad from Moscow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接