2017-08-26 2 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 Edited as '__int32' –

+2

しかし、なぜ '__int32'が関係するのか分かりません。標準では指定されていません。 '2'と' 60'はC言語の 'int'リテラルです。これを修正するために、私の答えの詳細を自由に借りてください。 – Bathsheba

0

1は、デフォルトの型が32ビット(通常は)の「int」である定数リテラルです。詳細はc++ constant literal typesフォームを参照してください。

((long long)1) << 60すればうまくいきました

関連する問題