2017-08-26 101 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它應該已經工作