web-dev-qa-db-ja.com

int32、int、int32_t、int8、int8_tの違い

最近、Cプログラムでデータ型int32_tに出会いました。私はそれが32ビットを格納することを知っていますが、intint32は同じことをしませんか?

また、プログラムでcharを使用したいと思います。代わりにint8_tを使用できますか?違いはなんですか?

要約すると:Cのint32、int、int32_t、int8、int8_tの違いは何ですか?

83
linuxfreak

int32int32_tの間(および同様にint8int8_tの間)の違いは非常に単純です:C標準はint8_tint32_tを定義しますが、int8またはint32という名前は定義しません-後者(存在する場合)はおそらく他のヘッダーまたはライブラリ(C99でint8_tおよびint32_tが追加される前の可能性が高い)。

プレーンなintは、他のものとはかなり異なります。 int8_tおよびint32_tのサイズがそれぞれ指定されている場合、intは16ビット以上の任意のサイズにできます。さまざまな時点で、16ビットと32ビットの両方がかなり一般的でした(64ビットの実装では、おそらく64ビットにする必要があります)。

一方、intは、Cのすべての実装に存在することが保証されていますが、int8_tおよびint32_tは存在しません。ただし、これがあなたにとって重要であるかどうかは疑問に思うかもしれません。小規模な組み込みシステムや古いコンパイラでCを使用している場合、問題になる可能性があります。主にデスクトップ/サーバーマシンの最新のコンパイラで使用する場合は、おそらく使用しません。

おっと-charに関する部分を見逃した。整数型のサイズが正確に8ビットであることを保証したい場合にのみ、charの代わりにint8_tを使用します。文字を保存する場合は、おそらくcharを代わりに使用する必要があります。サイズは(ビット数で)異なりますが、正確に1バイトであることが保証されています。ただし、ちょっと変わった点があります。プレーンなcharが署名されているか署名されていないかについての保証はありません(多くのコンパイラーは、コンパイル時フラグに応じてどちらかを作成できます)。署名されているか署名されていないことを確認する必要がある場合は、明示的に指定する必要があります。

102
Jerry Coffin

_tデータ型はstdint.hヘッダーのtypedef型ですが、intは組み込みの基本データ型です。これにより、stdint.hが存在する場合にのみ_tが使用可能になります。一方、intは存在することが保証されています。

13
Superman

明示的に指定されていない場合、 '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を調べることは悪いことではないと思います。

2
Naumann