どのプラットフォームでも常に4バイトの整数型を宣言する最良の方法は何ですか? 16ビットint
を持つ特定のデバイスや古いマシンについては心配しません。
#include <stdint.h>
int32_t my_32bit_int;
Cは整数型の正確なサイズにあまり関心がなく、C99はヘッダー stdint.h を導入します。これはおそらく最善の方法です。それを含めると、例えばint32_t
。もちろん、すべてのプラットフォームがそれをサポートしているわけではありません。
私の意見では、Coreyの答えは「ベスト」に対して正しいですが、単純な「int」も実際には機能します(16ビットintのシステムを無視している場合)。この時点で、多くのコードはintが32ビットであることに依存しているため、システムベンダーは変更しません。
(多くの64ビットシステムでlongが32ビットである理由と「long long」がある理由も参照してください。)
ただし、int32_tを使用する利点の1つは、この問題を永続させないことです。
ブライアングラッドマンのbrg_types.h
持っていない場合はstdint.h
。
brg_types.h
は、プラットフォーム上のさまざまな整数のサイズを検出し、一般的なサイズ(8、16、32、64ビット)のtypedefを作成します。
inttypes.h
はSolarisなどの一部のプラットフォームでは使用できないため、stdint.h
ではなくstdint.h
を含める必要があります。また、inttypes.h
にはLinuxなどのシステムでstdint.h
が含まれます。 inttypes.h
を含めると、LinuxとSolarisの間でコードの移植性が高まります。
このリンクは、私が言っていることを説明しています。 inttypes.hに関するHPリンク
また、このリンクには、データ型に特定のビット数が存在することを意図している場合にlong
またはint
を使用したくない理由を示す表があります。 ポータブルデータ型に関するIBMリンク
システムでstdint.hが使用できない場合は、独自に作成してください。私は常に「types.h」というファイルを持っています。このファイルには、すべての符号付き/符号なし8、16、32ビット値のtypedefがあります。
また、ターゲットプラットフォームに応じて、ビルドシステムにautotoolsを使用できます。
stdint.h/inttypes.hが存在するかどうかを確認し、存在しない場合は「config.h」に適切なtypedefを作成します
stdint.hは当然の選択ですが、必ずしも利用できるとは限りません。
移植性のあるライブラリを使用している場合、移植性のある固定幅整数を既に提供している可能性があります。たとえば、SDLにはSint32
(Sは「署名済み」を表す)、GLibにはgint32
。
<stdint.h>
を使用します。
実装が2の補数の32ビット整数をサポートする場合、int32_t
を定義する必要があります。
そうでない場合、次に最適なのはint_least32_t
です。これは、表現(2の補数、1の補数など)に関係なく、少なくとも32ビットの実装でサポートされる整数型です。
少なくとも32ビット幅の整数型であるint_fast32_t
もあります。これは、そのサイズ要件に対して最速の操作を可能にするために選択されたものです。
long
を使用できます。これは、標準で指定されている最小範囲要件の結果として少なくとも32ビット幅であることが保証されています。
最小の整数型を使用して32ビット数に合わせる場合は、<limits.h>
で定義されたマクロで次のようなプリプロセッサステートメントを使用できます。
#define TARGET_MAX 2147483647L
#if SCHAR_MAX >= TARGET_MAX
typedef signed char int32;
#Elif SHORT_MAX >= TARGET_MAX
typedef short int32;
#Elif INT_MAX >= TARGET_MAX
typedef int int32;
#else
typedef long int32;
#endif
#undef TARGET_MAX