【问题标题】:Why does shifting more than the allowed bits still work?为什么移位超过允许的位仍然有效?
【发布时间】:2013-03-24 15:06:21
【问题描述】:

我有一个int8_t,我想看看如果我将它向左移动超过 8 位会发生什么。所以这就是我所做的:

int8_t x = 1;

std::cout << (x << 10);

由于某种原因,这会返回 1024,就好像该类型包含足够的位来表示该数字一样。我认为当你移动超过给定的位时,你会在所有位中得到 0(或有符号的溢出/下溢,这会导致未定义的行为)。另外,我运行了这段代码来给我int8_t的最大数量:

std::numeric_limits<int8_t>::max(); // 127

这种类型的最大数量是 127,但是将它向左移动可以使它甚至高于它的无符号类型!这怎么可能?

【问题讨论】:

    标签: c++ binary bit-manipulation bitwise-operators bit-shift


    【解决方案1】:

    &lt;&lt; 的参数被隐式扩展为intx &lt;&lt; 10 的结果也是int

    【讨论】:

    • 如何保存到int8_t
    • @user2030677 你不能。如果需要,您可以在班次后转换结果。然后,您将实现定义的超出范围值到有符号整数类型的转换。
    • @DanielFischer ans NPE:假设如果我像这样转换:int8_t y = 10; std::cout &lt;&lt; (x &lt;&lt; y); 那么它将返回 int ? 或输出将是 0
    • @GrijeshChauhan 移位运算符的操作数受整数提升的影响,因此您总是至少得到int
    • @GrijeshChauhan 在这种情况下,没有什么新东西,你会得到 1024 打印。 &lt;&lt;&gt;&gt;右侧的类型不影响结果的类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2020-09-09
    • 1970-01-01
    相关资源
    最近更新 更多