デニス・リッチーが C を作成したとき、彼は int (符号付き整数型) をデフォルトの型にしました。 int の サイズ (ビット数) は意図的に指定されていません。 C が標準化されたときでさえ、保証されているのは 最小 サイズだけでした。 その理論的根拠は、int のサイズは、特定の CPU における整数の「自然な」ワード サイズでなければならないということでした。
より小さい符号付き整数のみが必要で、少しスペースを節約したい場合は、Ritchie が短いものを教えてくれました。または、より大きな整数が必要な場合は、彼は long を提供してくれました。 (C99 では、long long を使用してさらに大きな整数が提供されました。) 符号なし整数のみが必要な場合は、宣言に unsigned を含めることができます。 C99 では、特定のサイズの符号付き整数型エイリアス (例: int32_t) と符号なし型エイリアス (例: uint32_t) も提供されました。
ただし、プログラミングでは、負の整数 (したがって符号付き整数型が必要) はほとんどの場合必要ありません。 文字列の長さ、オブジェクトの数、オブジェクトのサイズ、ファイルのサイズなどはすべて符号なしの整数です。 特定のサイズの型エイリアスは、符号付き整数よりもさらに少なくて済みます。
それでも、整数型を不適切に使用するコードを たくさん見てきました。 このようなコードは、読者 (数か月後のあなた自身を含む) に、不明確な情報や誤解を招く情報を伝える可能性があります。 適切な目的に応じて適切な整数型を選択することが最善です。
整数型を選択するためのガイドラインは次のとおりです。
これは、memcpy()、strlen()、std::string::size() など、C と C の標準ライブラリの両方で使用される型なので、前例がたくさんあります。
非常に大きなファイルを扱う場合、一部のプラットフォームでは、-D_FILE_OFFSET_BITS=64 を指定してコンパイルして off_t の 64 ビット バージョンを取得する必要がある場合があります。
となるのは、値を「外部化」するとき、たとえばディスクに書き込むときやソケット経由で送信するときだけです。 実際には特定のビット数が必要ない場合に固定サイズの整数を使用すると、リーダーに誤った情報が伝達されます。
さらに:
サイズである必要がある必要がある整数値を表す場合は、標準の intptr_t または uintptr_t 型エイリアスを使用します。
負の値が必要な場合にのみ、short、int、long、long long のいずれかを使用します。これより小さい値または大きい値が必要な場合を除き、int が優先されます。
それ以外の場合は、同様に unsigned short、unsigned、unsigned long、または unsigned long long のいずれかを使用します。より小さい値またはより大きい値が必要な場合を除き、unsigned が優先されます。
結論
エピローグ
型でした。つまり、型をまったく指定しなかった場合、それは int であると理解されていました。 例:
power( x, n ) /* x and n are int; returns int */ { int p; for ( p = 1; n > 0; --n ) p *= x; return p; }
関数プロトタイプは C から C89 にバックポートされましたが、オリジナルの「K&R スタイル」関数定義は C23 まで引き続き許可されていました。 ANSI C 委員会は保守的な集団です。
さらに奇妙なことに、C99 以前では、次のような宣言で int を暗黙的に指定することもできました。
i; // int i *p; // int *p *a[4]; // int *a[4] *f(); // int *f()
以上がC および C での適切な整数型の選択の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。