60


6

Cで32ビット整数を宣言する方法

どのプラットフォームでも常に4バイトの整数型を宣言する最善の方法は何ですか? 私は16ビットの `int`を持っている特定のデバイスや古いマシンについて心配しません。

9 Answer


98


#含める

int32_t my_32bit_int;


12


Cは整数型の正確なサイズにはそれほど関係ありません。C99はhttp://en.wikipedia.org/wiki/Stdint.h [stdint.h]というヘッダーを導入しています。これはおそらく最善の策です。 それを含めるとあなたが使用することができます例えば int32_t。 もちろん、すべてのプラットフォームがそれをサポートしているとは限りません。


11


Coreyの答えは、私の考えでは、 "best"には正しいのですが、単純な "int"も実際にはうまくいくでしょう(16ビットintのシステムを無視しているのなら)。 現時点では、多くのコードがintに32ビットであることに依存しているため、システムベンダはそれを変更しません。

(多くの64ビットシステムでlongが32ビットである理由と、なぜlongがあるのか​​も参照してください。)

ただし、int32_tを使用する利点の1つは、あなたがこの問題を永続させていないということです!


5


stdint.h`がなければBrian Gladmanの brg_types.h`のコピーを探すことができます。

`brg_types.h`はあなたのプラットフォーム上の様々な整数のサイズを見つけ、共通のサイズ(8、16、32、64ビット)のtypedefを作ります。


5


stdint.h`はSolarisのようないくつかのプラットフォームでは利用できないので stdint.h`の代わりに `inttypes.h`を含める必要があります。 Linuxとして。 もしあなたが `inttypes.h`をインクルードするなら、あなたのコードはLinuxとSolarisの間でもっと移植性があります。

このリンクは、私が言っていることを説明しています。

そしてこのリンクはあなたのデータ型にあるビット数が存在するという意図があるならばなぜあなたが long`や int`を使いたくないのかを示す表を持っています。 http://www.ibm.com/developerworks/library/l-port64/index.html#N10063 [ポータブルデータタイプに関するIBMのリンク]


0


stdint.hがあなたのシステムで利用できない場合は、あなた自身のものを作ってください。 私はいつも "types.h"と呼ばれるファイルを持っていて、それは全ての符号付き/符号なしの8、16、そして32ビット値のtypedefを持っています。


0


ターゲットプラットフォームによっては、ビルドシステムに自動ツールを使用することもできます。

stdint.h / inttypes.hが存在するかどうか、そしてそれらが "config.h"に適切なtypedefを作成しないかどうかがわかります。


0


stdint.hは明らかな選択ですが、必ずしも利用可能とは限りません。

ポータブルライブラリを使用している場合は、すでにポータブル固定幅整数が提供されている可能性があります。 例えば、SDLは Sint32(Sは" signed "を意味します)を持ち、GLibは` gint32`を持ちます。


0


C99以降

``を使用してください。

あなたの実装が2の補数の32ビット整数をサポートするならば、それは `int32_t`を定義しなければなりません。

そうでなければ、次善の策は `int_least32_t`です。これは表現に関係なく(2の補数、1の補数など)少なくとも32ビットの実装でサポートされている整数型です。

そのサイズ要件のための最速演算を可能にする目的で選ばれた、少なくとも32ビット幅の整数型である `int_fast32_t`もあります。

ANSI C

あなたは `long`を使うことができます、それは規格によって指定された最小範囲要件の結果として少なくとも32ビット幅であることが保証されています。

32ビットの数値に合わせるために最小の整数型を使用したい場合は、 ``で定義されているマクロで以下のようなプリプロセッサ文を使用できます。

#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