web-dev-qa-db-ja.com

64ビットデータモデルでの64ビット符号なし整数リテラルの指定

さまざまなタイプの64ビットデータモデル(LLP64/IL32P64、LP64/I32LP64、ILP64、SILP64)があるので、64ビット符号なし整数リテラルを指定する標準準拠方法は何ですか?

ULLのサフィックスを指定するだけで十分ですか?または、一部のデータモデルでリテラルが128ビットとして解釈されることになりますか?

26
Zach Saw

_<cstdint> / <stdint.h>_があれば、それを使用する必要があります。これにより、以下が得られます。

  • _uint64_t_は、サイズが64ビットの符号なし整数型です
  • UINT64_C()は、マクロに適切なサフィックスを追加することにより、タイプ_uint64_t_の定数を作成するためのマクロです。
39
unwind

CおよびC++には、標準化された32/64/128ビット変数型がありません。たとえば、一部のシステムでは32ビットで、他のシステムでは64です。面倒ですが、ほとんどのOSはuint32など、より良いtypedefを提供してくれるので、必要な正確な型を選択することができます。

これは優れたconfigureスクリプトの仕事です。システムが提供するものを決定し、それが機能することをテストし、実行している適切なアーキテクチャに適切なタイプを選択するのに役立ちます。

1
Wes Hardaker

私の知る限り、整数リテラルを特定のビット幅に接尾する方法はありません。唯一のオプションはl、ul、ll、およびullです。

あなたがそれについて妄想している場合、long/#ifのサイズをチェックするlong longでリテラルをラップする必要があります。

繰り返しますが、KennyTMが上記で指摘したように、リテラルareが64ビットの範囲にある場合およびが64ビット値に割り当てられている限り、リテラル自体がそれほど重要ではありません64ビットまたは128ビット、またはそれですか?

1
DevSolar

ほとんどの場合、それは重要ではありません。接尾辞を付けない場合、整数リテラルのタイプはその値によって決まります。コンパイラに32ビットのunsigned longと64ビットのunsigned long longがある場合、unsigned longには収まらないがunsigned long longには大きすぎない符号なしの値はunsigned long long型になります。

1
Pete Becker