プリプロセッサに関する限り、0xFFFFFFFF
は単なる 16 進数の定数です。#if
プリプロセッサ式 (およびディレクティブでのみ関連する#elif
) の数値は、使用可能な最も広い整数型であると見なされます。プリプロセッサは、値が 2 32 -10xFFFFFFFF
の符号付き整数定数として扱います(C99 以降では、少なくとも 64 ビットの整数型が常に存在するため)。4294967295
#if
orディレクティブ以外の場所にある場合#elif
、プリプロセッサは関係ありません。16 進定数の型は、次の最初のものです。
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int
この特定の定数には、いくつかの可能性があります。
int
が 32 ビットより狭く、32 ビットより広い場合long
、型はlong
;
int
が 32 ビットより狭く、正確に 32 ビットの場合long
、型はunsigned long
;
int
が 32 ビットの場合、タイプはunsigned int
;
int
が 32 ビットより広い場合、型はint
です。
最新のシステムでunsigned int
はunsigned long
、可能性が最も高いです。
すべての場合において、 の値0xFFFFFFFF
は正確に 2 32 -1 または4294967295
です。負の値になることはありません。
ただし、 の値を (明示的または暗黙的に)符号付きの型に変換する-1
ことで、負の値 (たとえば)を簡単に取得できます。0xFFFFFFFF
int n = 0xFFFFFFFF;
しかし、これは移植性がありません。int
が 32 ビットより広い場合、格納される値は 2 32 -1 になります。が正確に 32 ビットであってもint
、符号なしの値を符号付きの型に変換した結果は実装定義です。-1
は一般的な結果ですが、保証されていません。
に関しては~0
、それint
は値のすべてのビットが 1 に設定されている式です。これは通常 -1
は ですが、保証されていません。
正確に何をしようとしていますか?