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


103

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

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

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

回答:


122

int32int32_t、(同様の間int8int8_t)の違いは非常に単純です:C標準定義int8_tint32_t、しかし、名前の何も定義していませんint8int32- (彼らはすべてに存在する場合)、後者をいくつかの他のヘッダやライブラリから、おそらくある(最も可能性が高いですint8_tおよびint32_tC99での追加よりも前からです。

プレーンintは他のものとはかなり異なります。ここで、int8_tint32_t指定された各サイズを有する、int任意のサイズ> = 16ビットとすることができます。時々、16ビットと32ビットの両方がかなり一般的でした(64ビットの実装では、おそらく64ビットであるはずです)。

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

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


1
@linuxfreak:わからないbool_t-これまで聞いたことがない。C標準では_Bool組み込み型として定義されています。bool#include <stdbool.h>(に展開されるマクロとして)の場合にのみ定義されます_Bool
Jerry Coffin 2013年

5
「64ビット実装の場合、(int)はおそらく64ビットになるはずです」実際には、intは、Windows、Mac OS X、Linux、およびさまざまな種類のUNIXを含むすべての一般的な64ビットプラットフォームで32ビットです。1つの例外はCray / UNICOSですが、最近は時代遅れになっています。
サムワトキンス

6
@SamWatkins:はい、それが私が「あるべき」ではなく「すべきである」と慎重に言った理由です。標準は、それが「アーキテクチャによって提案された自然なサイズ」であると述べています(IMO)は、64ビットプロセッサでは、実際に 64ビットであることを意味します(ただし、良くも悪くも、通常はそうではありません) t)。より実用的な観点から見ると、C89の型の中で32ビット型を使用する非常に便利です。intが64ビットの場合、longも64ビット以上にする必要があるため、32ビット型は存在しません。タイプ。
Jerry Coffin

2
@barlop:はい。(CとC ++の両方で、charの値の最小範囲は255であるため、少なくとも8ビットが必要ですが、それ以上になることもあります)。
Jerry Coffin

2
私は常に、1バイトは正確に8ビットであり、8ビット以上ではないという印象を受けていました
ErlVolton

18

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


1
なぜ_tのものを使用するのですか?
2016年

@Devenコードがどこかで機能し、どこかで機能しないケースを回避するため。
フランクリンユー

2

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


1
コードにタイプミスがあります:typedef short INT16;ではなくtypedefs short INT16
Galaxy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.