为什么按位左操作给出错误的答案?
问题描述:
正如它自己所说的问题 - 按位左运算符给出了错误的答案。 这里是我的代码 -为什么按位左操作给出错误的答案?
#include <iostream>
#include<cmath>
using namespace std;
int main() {
unsigned long long int a,b;
a=pow(2,60);
b=1<<60;
cout<<a<<endl<<b<<endl;
return 0;
}
Output -
1152921504606846976
0
任何人都可以解释为什么这是怎么回事? 在此先感谢
答
1<<60;
与int
类型的评估,你观察到的结果与你的溢出int
的范围你的平台上是一致的。 (将该表达式分配给unsigned long long
的事实不相关。)
修复1ULL << 60
以强制进行适当的参数提升。
你的编译器没有试图提醒你这个吗?如果不是,则调高警告等级。
答
1是一个常量字面值,其默认类型是32位(通常)的“int”。请参阅c++ constant literal types表格更多详细信息。
如果您已经完成((long long)1) << 60
它应该已经工作
打开警告。 –
@ T.C。另外,使用选项'-Wall'总是一个好习惯。 – iBug