次のように、ハードコードされた定数に"long long" ( LL) データ型定義を使用する従来のコードを変更しています。
0xFFFFFFFFFFFFFFFFLL
LL定数に追加された は、この定数が として解釈されることを保証すると信じていlong longます。
long longただし、ビット数に関して特定のコンパイラ依存の解釈があることに依存したくありません。
LLしたがって、変数宣言を定数なしで行い、代わりに次を使用したいと思います。
uint64_t a = static_cast<uint64_t>(0xFFFFFFFFFFFFFFFF);
0xFFFFFFFFFFFFFFFFにキャストする前に、定数がコンパイラによって 32 ビット整数として解釈されないことを考えたいと思いますuint64_t。これにより、目的の値ではなくa、値 を含む 64 ビット整数になります。0xFFFFFFFF
(現在関心のある 64 ビット コンパイラは VS 2010 と Ubuntu 12.04 LTS GCC です。ただし、このコードが最新のコンパイラで望ましい方法で動作することを願っています。)
上記のコードは、最新のほとんどまたはすべてのコンパイラで必要に応じて機能するので、 の値は、必要に応じて、定数の末尾にを含めずにa、定数 のすべての数字を含めるように適切に設定されますか?0xFFFFFFFFFFFFFFFFLL
(注:I64定数の末尾にインクルードすると、コンパイラ エラーが発生します。おそらく、定数を 64 ビット整数として解釈するようにコンパイラに指示するために、定数の末尾にインクルードする必要がある (またはインクルードできる) 別のトークンがありますか?)
(また:static_cast<uint64_t>変数は明示的に uint64_t として定義されているので、もしかしたら不要かもしれません?)