Solaris 64 ビット 開発ガイド

<inttypes.h> ファイル

定数、マクロ、および派生型を定義するために、インクルードファイル <inttypes.h> が Solaris 2.6 リリースに追加されました。これにより、コンパイル環境とは無関係に、プログラマが記述したコードをサイズ指定されたデータ項目と明示的に互換性を持たせることができます。このファイルには、8 ビット、16 ビット、32 ビット、および 64 ビットのオブジェクトを操作するための機構が含まれてます。このインクルードファイルは、ANSI C の原案の一部で、ISO/JTC1/SC22/WG14 C 委員会による現在の ISO C 標準、つまり ISO/IEC 9899:1990 プログラミング言語 - C の改訂案を反映しています。

<inttypes.h> の主な機能は、次のとおりです。

これらについては以降の節で説明します。

固定幅整数型

<inttypes.h> で提供される固定幅整数型には、int8_tint16_tint32_tint64_tuint8_tuint16_tuint32_tuint64_t などの符号付き整数型および符号なし整数型があります。特定のビット数を格納できる最小の整数型として定義される派生型には、int_least8_tint_least64_tuint_least8_tuint_least64_t があります。

これらの固定幅型を無制限に使用しないでください。たとえば、int はこれまでと同様に、ループカウンタやファイル記述子などについて使用でき、long は配列のインデックスに使用できます。固定幅型は、次に示すような明示的なバイナリ表現に使用してください。

uintptr_t とその他の有用なデータ型

<inttypes.h> によって提供されるその他の型として、ポインタを格納するために十分なサイズの符号付き整数型および符号なし整数型があります。これらの型には、intptr_tuintptr_t があります。さらに、intmax_t および uintmax_t という (ビット単位で) 最長の符号付きおよび符号なしデータ型があります。

uintptr_t 型をポインタ用の整数型として使用する方が、unsigned long のような基本データ型を使用するよりも便利です。unsigned long は、IPL32 と LP64 データ型モデルの両方でポインタと同じサイズですが、uintptr_t を使用すると、uintptr_t の定義を変更するだけで異なるデータ型モデルを使用できます。このため、他の多くのシステムに移植が可能となります。またこれによって、C プログラムコード中に意図する処理をより明確に記述することができます。

intptr_tuintptr_t 型は、アドレス計算をする際にポインタをキャストするのに非常に役に立ちます。long または unsigned long の代わりにこれらを使用することができます。


注 –

通常は、uintptr_t を使用してキャストする方が、intptr_t を使用するよりも安全です。特に比較の場合はこの方法が安全です。


定数マクロ

マクロは、定数のサイズと符号を指定するために使用できます。マクロには、INT8_C(c)、...、INT64_C(c)UINT8_C(c)、...、UINT64_C(c) があります。基本的にこれらのマクロは、必要な場合に定数の後ろに lulll、または ull を置きます。たとえば、INT64_C(1) は、定数 1 の後ろに ILP32 の場合は ll を、LP64 の場合は l を付加します。

定数を最大のデータ型にするためのマクロには、INTMAX_C(c)UINTMAX_C(c) があります。これらのマクロは、「LP64 への変換のためのガイドライン」で説明している定数の型を指定するのに非常に役に立ちます。

<inttypes.h> によって定義される制限値

<inttypes.h> に定義されている制限値は、さまざまな整数型の最小値および最大値を指定する定数です。このファイルには、INT8_MIN、...、 INT64_MININT8_MAX、...、INT64_MAX、およびこれらの符号なし定数の、各固定幅型の最小値と最大値が指定されています。

最小サイズ型のそれぞれの最小値と最大値も指定されています。すなわち、INT_LEAST8_MIN、...、 INT_LEAST64_MININT_LEAST8_MAX、...、INT_LEAST64_MAX、およびこれらの符号なし定数です。

サポートされている整数型のうちの最大の型の最小値と最大値も定義されています。これらには、INTMAX_MININTMAX_MAX、およびそれらの符号なしのものがあります。

書式文字列マクロ

printfscanf の書式指示子を指定するためのマクロも <inttypes.h> にあります。これらのマクロは、引数のビット数がマクロ名に組み込まれている場合に、初期指示子の先頭に l または ll を付加することによって引数を long または long long として指定します。

printf(3C) 書式指示子用のマクロは、10 進、8 進、符号なし、16 進の、8 ビット、16 ビット、32 ビット、64 ビットの整数、最小整数型と最大整数型を出力するためのものです。64 ビットの整数を 16 進表記で出力する例を、次に示します。

int64_t i;
printf("i =%" PRIx64 "\n", i);

同様に、scanf(3C) 書式指示子用のマクロが、10 進、8 進、符号なし、および 16 進の 8 ビット、16 ビット、32 ビット、64 ビットの整数、ならびに最小整数型と最大整数型の読み込み用に提供されています。符号なし 64 ビットの 10 進整数を読み込む例を、次に示します。

uint64_t u;
scanf("%" SCNu64 "\n", &u);

これらのマクロは、無制限に使用しないでください。これらは固定幅型と一緒に使用するのが最適な使用方法です。詳細は、「固定幅整数型」を参照してください。