2016-07-07 11 views
3

私は代入ステートメントですぐにキャストする必要があるC++コードがあります。キャスティングはコードを読みにくくし、私はこれを回避する手段があることを期待していました。それは32ビットの値として1即時の治療ですので、私は、キャストせずにこのコードを記述する場合代入で値をキャストする必要があります

uint64_t shifted_val = (uint64_t)1 << 50; 

は、shifted_valが0に設定されます、私が想定しています。私はキャスティングせずにこれを書くことができるように私は行方不明のものがありますか?

+4

書き込み '(1ull << 50) –

+1

定数' 1'は 'int'型ですが(多分それが起こるビット数が多いため)、' 1 << 50'も 'int'型です。そして実際に '1 << 50'は' int'が50ビットより広い場合を除き、未定義の振る舞いをします。 –

答えて

5

一つの方法は、実行する習慣を採用することです受信者変数自体の中での計算

uint64_t shifted_val = 1; 
shifted_val <<= 50; 

これは当然ながら問題を解決します式への追加の型参照(型キャストや型固有の接尾辞など)をハードコードすることをお勧めします。

+0

これは最高の答えだと思います。 –

2

定数は64ビットの値として扱う必要があるため、その定数を指定する方法が必要です。

1ULLと指定すると、コンパイラにはunsigned long longという値が指定されますが、必ずしも64ビットである必要はありません。したがって、キャストの移植性を良くする方がよいでしょう。

あなたが行うことができます
+0

'1ull'は**少なくとも64ビット幅で**これはすべて必要です。 –

6

uint64_t shifted_val = 1ull << 50; 

を使用すると、構文はまた、あなたが行うことができますをキャストに近いと思われる場合:それを行うには

uint64_t a = 1; 
uint64_t shifted_val = a << 50; 
+0

カッコは無害ですが不要です。 –

+0

括弧が削除されました。 – PhotometricStereo

関連する問題