2016-04-17 35 views
3

uint64_t x(1 << 35)は、出力として0と警告を出します。そのような大きな値を初期化するのに最も適切なものは何でしょうか?C++でuint64_tを初期化する方法11

+0

左辺が十分に大きいため、式「1ULL << 35」は無効です。 –

+2

'(static_cast (1)<< 35)はどうですか? –

+1

C++ 11以降では、[ '](https://stackoverflow.com/questions/36406333/fixed-width-integer-literals-in-c)の[新しいリテラルを定義することもできます。このような問題を避けるために使用してください。 – mceo

答えて

9

1 << 35intを使用しているためです。 64ビットタイプを使用する場合は、1ULL << 35を使用して、少なくとも64ビットであることが保証されているunsigned long longを使用して操作していることを確認してください。

2

問題は、コンパイル時定数式1 < < 35がint型で実行されることです。だからあなたはそのタイプのオーバーフローしている可能性があり、その動作は未定義です!

最も簡単な修正は、1ULL < < 35を使用することです。符号なしlong longリテラルは、少なくとも64ビットでなければなりません。

4
auto x = std::uint64_t(1) << 35; 
1
uint64_t x = 1000000000ull; 

ULLマーク通常長い長いのunsigned long長い

int64_t y = 1000000000ll; 

と同じ値。

uint64_t x2 = (1ull << 35ull); 

は、単にあなたの番号の末尾にULLを追加します。

関連する問題