2017-08-26 76 views
0

正如它自己所说的问题 - 按位左运算符给出了错误的答案。 这里是我的代码 -为什么按位左操作给出错误的答案?

#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 

任何人都可以解释为什么这是怎么回事? 在此先感谢

+3

打开警告。 –

+1

@ T.C。另外,使用选项'-Wall'总是一个好习惯。 – iBug

回答

5

1<<60;int类型的评估,你观察到的结果与你的溢出int的范围你的平台上是一致的。 (将该表达式分配给unsigned long long的事实不相关。)

修复1ULL << 60以强制进行适当的参数提升。

你的编译器没有试图提醒你这个吗?如果不是,则调高警告等级。

0
sizeof(__int32) == 4 
60/8 == 7 
7 > 4 

因此溢出。

+2

'sizeof(int)== 4';往往是这种情况,但并非一定如此。 – Bathsheba

+0

@Bathsheba编辑为'__int32' –

+2

但我不明白为什么'__int32'是相关的。这在标准中没有规定。 '2'和'60'是C中的'int'字面值。随意从我的答案中借用详细信息以纠正此问题。 – Bathsheba

0

1是一个常量字面值,其默认类型是32位(通常)的“int”。请参阅c++ constant literal types表格更多详细信息。

如果您已经完成((long long)1) << 60它应该已经工作

相关问题