64 ビット データ モデルにはさまざまな種類 (LLP64/IL32P64、LP64/I32LP64、ILP64、SILP64) がありますが、64 ビット符号なし整数リテラルを指定する標準準拠の方法は何ですか?
ULL のサフィックスを指定するだけで十分でしょうか? それとも、一部のデータ モデルでリテラルが 128 ビットとして解釈されることになるのでしょうか?
ある場合は、使用する必要<cstdint> / <stdint.h>
があります。これにより、次のことが得られます。
uint64_t
サイズが64ビットの符号なし整数型ですUINT64_C()
uint64_t
マクロに適切な接尾辞を追加させることにより、タイプ の定数を作成するためのマクロです。私の知る限りでは、整数リテラルを特定のビット幅にサフィックスする方法はありません。あなたの唯一のオプションは、l、ul、ll、および ull です。
それについて偏執的である場合は、 /#if
のサイズをチェックしてリテラルをラップする必要があります。long
long long
繰り返しになりますが、KennyTM が上で指摘したように、リテラルが64 ビットの範囲内にあり、64 ビットの値に割り当てられている限り、リテラル自体が 64 ビットか 128 ビットかは問題ではありません。
ほとんどの場合、それは問題ではありません。接尾辞を付けない場合、整数リテラルの型はその値によって決定されます。コンパイラに 32 ビットunsigned long
と 64ビットがある場合unsigned long long
、大きすぎて に収まらunsigned long
ないが、大きすぎない符号なし値のunsigned long long
型は になりますunsigned long long
。
CおよびC++には、標準化された32/64/128ビット変数タイプがありません。たとえば、一部のシステムでは32ビット、その他のシステムでは64ビットが長くなります。面倒ですが、ほとんどのOSには、などのより優れたtypedefが用意されているuint32
ため、必要なタイプを正確に選択する必要があります。
これは優れたconfigure
スクリプトの仕事です。システムが提供するものを判別し、それが機能することをテストし、実行している適切なアーキテクチャーに適切なタイプを選択するのに役立ちます。