编译下面的代码后,我得到了一个奇怪的结果,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/