web-dev-qa-db-ja.com

日常のプログラミングの慣例としてのuint32_tとint

いつstdint.hのデータ型を使用する必要がありますか?それらを常に慣例として使用することは正しいですか? intやshortのような非特定サイズタイプの設計の目的は何でしたか?

17
Guy

いつstdint.hのデータ型を使用する必要がありますか?

  1. プログラミングタスクが整数幅を指定する場合、特に一部のファイルまたは通信プロトコル形式に対応するため。
  2. パフォーマンスよりもプラットフォーム間の高度な移植性が必要な場合.

それらを(それから)慣例として常に使用することは正しいですか?

物事はそのように傾いています。固定幅タイプは、Cに最近追加されたものです。元のCにはchar, short, int, longthatは、tooに特定されることなく、試してみると進歩的でした、さまざまなプロセッサと環境で利用可能なさまざまな整数サイズに対応します。 Cは40歳ですが、その戦略の成功を物語っています。多くのCコードが記述されており、ソフト整数仕様のサイズにうまく対応しています。一貫性に対するニーズの高まりとともに、char, short, int, long and long long、十分ではない(または少なくともそれほど簡単ではない)ので、int8_t, int16_t, int32_t, int64_t は生まれた。新しい言語では、非常に具体的な固定整数サイズの型と2の補数が必要になる傾向があります。彼らが成功したので、ダーウィンの圧力はCを押し上げます。私の水晶玉は、Cでの固定幅型の使用の増加への移行が遅いと見ています。

Intやshortのような非特定サイズタイプの設計の目的は何でしたか?

これは、さまざまな整数幅(8、9、12、18、36など)とエンコーディング(2、1、符号/マグ)に対応するための良い最初のステップでした。今日のコーディングの多くは、2の補数を持つ2の累乗サイズの整数を使用しているため、他の多くの配置が事前に存在していたことに気付かない場合があります。こちらもご覧ください answer .

私の仕事は私がそれらを使用することを要求し、私は実際にそれらを使用するのが大好きです。

プロトコルを実装し、送信する必要があるメッセージまたは特定の情報の保持者である可能性のある構造体の内部でそれらを使用する必要がある場合に便利です。

インクリメントする必要があるシーケンス番号を使用する必要がある場合、シーケンス番号は負であると想定されていないため、intは使用しません。代わりにuint32_tを使用します。したがって、シーケンス番号スペースがわかるので、それに応じて計画/コーディングできます。

私たちが作成したコードは、32ビットと64ビットのマシンで実行されるため、異なるビットマシンで「int」を使用すると、識別が困難な微妙なバグが発生します。 unint16_tを使用すると、32ビットまたは64ビットアーキテクチャで16ビットが割り当てられます。

4
Nikhil

いいえ、これらを汎用プログラミングに使用することは決して良い考えではありません。

ビット数を本当に気にする場合は、先に進んでそれらを使用しますが、ほとんどの一般的な使用では気にしないので、一般的なタイプを使用します。一般的なタイプmightの方が高速で、確実に読み書きしやすくなっています。

3
unwind

固定幅のデータ型は、本当に必要な場合にのみ使用してください(たとえば、転送プロトコルを実装したり、ハードウェアにアクセスしたり、特定の範囲の値を要求したりする場合(_..._least_..._バリアントを使用する必要があります))。プログラムは、変更された環境で他に適応しません(たとえば、ファイルサイズに_uint32_t_を使用しても10年前は問題ないかもしれませんが、_off_t_は最近のニーズに適応します)。他の人が指摘したように、16ビットプラットフォームではintが_uint32_t_よりも高速である可能性があるため、パフォーマンスに影響がある可能性があります。

int自体は、その署名のために非常に問題があります。使用することをお勧めします。 _size_t_変数がstrlen()またはsizeof()の結果を保持している場合。

2
ensc