c++ - 为什么带变量的左移与带常量的左移产生不同的结果?

标签 c++ bit-shift

编译下面的代码后,我得到了一个奇怪的结果,a =1 而 b =0。谁能解释一下幕后发生的事情?

#include<iostream>
using namespace std;

int main(){

    int n=32; 
    int a=1<<n;  //turns out a=1
    int b=1<<32; //turns out b=0
    cout<<"a="<<a<<endl;
    cout<<"b="<<b<<endl;
}

最佳答案

该标准没有定义,或者更确切地说,它将其定义为“未定义的行为”,即在左移超出整数类型的大小的情况下会发生什么。 [这种未定义行为的原因是不同的硬件可能会或可能不会表现相同,例如,向左移动 32 位]。

在第一种情况下[至少没有优化],编译器生成指令来计算1 << 32 - 在 x86 上变成 1 << (32 & 31)1 << 0 相同- 因此你得到 1。

在第二种情况下,编译器会自己计算值,这会变成溢出,并给出零。

很可能(但不确定),如果您更改编译器选项以优化代码,则这两种情况都为零。如果你要进行较小的轮类循环,你将获得你想要的行为(尽管你可能会发现数字变为负数这一事实的“有趣”行为,所以最好对所有轮类操作使用无符号,真的) .

关于c++ - 为什么带变量的左移与带常量的左移产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16515534/

相关文章:

c++ - 在 C++ unix 中异步写入文件

c++ - 读出 XML 在 C++ 中提供意外输出

c++ - 为什么我不能用 `= delete;` 声明一个纯虚函数?

c++ - 在 C++ 中使用 <<++ 和 >>++ 运算符

c++ - RTTI 是指动态绑定(bind)吗?

c++ - DirectX 9 固定功能纹理

java - 为什么右移运算符产生零而不是一?

c++ - 将字符串变量的值与一些文本链接起来,并将其打印到 C++ 中的标准输出

java - 右逻辑/无符号移位插入 1 而不是 0 作为符号位

java - 为什么Java不能正确计算逻辑右移?