int32_t
最近、Cプログラムのデータ型に遭遇しました。私はそれが32ビットを格納することを知っていますが、同じことint
をint32
しませんか?
また、char
プログラムで利用したいです。int8_t
代わりに使用できますか?違いはなんですか?
要約すると、Cのint32、int、int32_t、int8、int8_tの違いは何ですか?
int32_t
最近、Cプログラムのデータ型に遭遇しました。私はそれが32ビットを格納することを知っていますが、同じことint
をint32
しませんか?
また、char
プログラムで利用したいです。int8_t
代わりに使用できますか?違いはなんですか?
要約すると、Cのint32、int、int32_t、int8、int8_tの違いは何ですか?
回答:
間int32
とint32_t
、(同様の間int8
とint8_t
)の違いは非常に単純です:C標準定義int8_t
とint32_t
、しかし、名前の何も定義していませんint8
かint32
- (彼らはすべてに存在する場合)、後者をいくつかの他のヘッダやライブラリから、おそらくある(最も可能性が高いですint8_t
およびint32_t
C99での追加よりも前からです。
プレーンint
は他のものとはかなり異なります。ここで、int8_t
とint32_t
指定された各サイズを有する、int
任意のサイズ> = 16ビットとすることができます。時々、16ビットと32ビットの両方がかなり一般的でした(64ビットの実装では、おそらく64ビットであるはずです)。
一方、int
Cのすべての実装に存在することが保証されているint8_t
とint32_t
されません。これがあなたにとって重要であるかどうか疑問に思われるかもしれません。小さな組み込みシステムや古いコンパイラでCを使用している場合は、問題がある可能性があります。主にデスクトップ/サーバーマシンの最新のコンパイラーで使用する場合、おそらく使用されません。
おっと-一部を逃したchar
。int8_t
正確に8ビットのサイズであることが保証された整数型が必要な場合(かつその場合のみ)、charの代わりに使用します。文字を格納したい場合は、おそらくchar
代わりに使用したいでしょう。サイズは(ビット数の点で)異なる場合がありますが、正確に1バイトであることが保証されています。ただし、少し奇妙な点が1つあります。プレーンchar
が署名されているか、署名されていないかは保証されていません(多くのコンパイラは、コンパイル時のフラグに応じて、どちらでもかまいません)。署名されているかどうかを確認する必要がある場合は、明示的に指定する必要があります。
明示的に指定されていない場合は 'size'は可変であるため、宣言する場合は常に注意してください
int i = 10;
一部のシステムでは、コンパイラーによって16ビット整数が生成される場合があり、32ビット整数(または新しいシステムでは64ビット整数)になる場合があります。
組み込み環境では、これは奇妙な結果になる可能性があります(特に、メモリマップI / Oの処理中、または単純な配列の状況を検討している可能性があります)。そのため、固定サイズの変数を指定することを強くお勧めします。レガシーシステムでは、
typedef short INT16;
typedef int INT32;
typedef long INT64;
C99以降、設計者は基本的に同様のtypedefを利用するstdint.hヘッダーファイルを追加しました。
Windowsベースのシステムでは、stdin.hヘッダーファイルのエントリは次のようになります。
typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef unsigned char uint8_t;
最小幅の整数型や正確な幅の整数型など、それ以上のものがあります。理解を深めるためにstdint.hを探索することは悪いことではないと思います。
typedef short INT16;
ではなくtypedefs short INT16
。
bool_t
-これまで聞いたことがない。C標準では_Bool
組み込み型として定義されています。bool
が#include <stdbool.h>
(に展開されるマクロとして)の場合にのみ定義されます_Bool
。