4

次のように、ハードコードされた定数に"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 として定義されているので、もしかしたら不要かもしれません?)

4

2 に答える 2

5

C++11 標準のパラグラフ 2.1.14/2:

整数リテラルの型は、その値を表すことができる表 6 の対応するリストの最初のものです。

表 6 は、16 進リテラル定数の場合、リテラルの型は次のようにする必要があることを示しています。

  • int; または(収まらない場合)
  • unsigned int; または(収まらない場合)
  • long int; または(収まらない場合)
  • unsigned long int; または(収まらない場合)
  • long long int; または(収まらない場合)
  • unsigned long long int.

0xFFFFFFFFFFFFFFFF上記のリストの最初の 5 つのタイプのいずれにも当てはまらないという合理的な仮定を立てると、そのタイプは になりますunsigned long long int。64 ビット コンパイラを使用している限り、この型の値のサイズは 64 ビットであり、定数はunsigned long long int希望どおり 64 ビットとして解釈されると想定するのが合理的です。

于 2013-04-02T16:32:17.733 に答える