2017-12-27 50 views
-1

今、私はどのように私は警告なしで巨大な数に長くロングを設定するのですか?

long long x = 1 << 60; 
cout << x << endl; 

を持っていると私は長い長いの範囲は2^64までのすべての方法であることを知っているが、私は、コードの一部を実行し、いくつかの理由で、それは私にその警告を与えます「left shift count >= width of type [-Wshift-count-overflow].

さらに、0がスクリーンに印刷されていますが、これは明らかに私が望むものではありません。

私はそれの後に文字通り「LL」を入れてみましたが、私はそれを置くべき場所私は知らない。誰がどのように私に教えてもらえ

long long x = (1 << 60)ll; 
long long x = (1 << 60ll); 

と、それらのどれも

働くんこれを修正しますか?前もって感謝します!

+1

正しいリテラルのタイプを使用しますhttp://en.cppreference.com/wを/ cpp/language/integer_literal –

+0

@NeilButterworth私はそれを試みたが、どこに置くべきか... 60年後? 1?かっこの後ろに? –

+0

あなたは多かれ少なかれランダムに試しているように見えるので、 '(1 << 60)'に 'll'を加えることができる** 3つの**場所があることに注意してください。あなたは2つだけ試しました。 –

答えて

3

この式のために期待するのはよくある間違いです:

long long x = 1 << 60; 

左側のタイプは右側の計算に影響を与えること。そうではありませんが、1 << 60の結果は左の型に変換されますが、それ自体は1 << 60の計算には影響しません。だから、適切な解決策は1の種類を変更することです:

long long x = static_cast<long long >(1) << 60; 

または

long long x = 1LL << 60; 

あるいは

auto x = 1LL << 60; 
+0

オハイオー大丈夫、本当にありがとう! –

関連する問題