整数は、「構造」とさえ呼べるのであれば、コンピューティングにおける最も基本的なデータ構造です。プログラマーとしての私たちの仕事は、これらの数字に意味を与えることです。ソフトウェアがどれほど複雑であっても、最終的には単なる整数であり、プロセッサは整数のみを理解します。
負の数が必要な場合は、2 の補数を発明しました。小数が必要な場合は、一種の科学表記法を作成し、 — ドーン — 浮動小数点数を作成します。結局のところ、0 と 1 から逃れることはできません。
C では、int はほぼ自然型です。コンパイラは文句を言うかもしれませんが、ところどころにいくつかのフラグを設定すれば、ほとんどのコンパイラは次のような記述を許可します:
main(void) { return 0; }
技術的には、これは次と同じです:
int main(void) { return 0; }
この動作は、プログラマが型を指定しなかった場合、デフォルトで整数を使用するのが合理的であると考えるのが常識だった時代に由来しています。
C はこの考えを念頭に置いて設計されました。当初、int には標準サイズがありませんでした。 PDP-11 プロセッサ (C が最初に作成されたマシン) では、16 ビット アドレス指定が使用されていました。したがって、int も 16 ビットであることが理にかなっていると考えられていました。プロセッサが進化するにつれて int のサイズも大きくなるという考えがありました。
このアプローチではいくつかの問題が発生しました。 int のサイズがプラットフォーム間で異なる場合、プロセッサごとにコンパイルされたプログラムの動作が異なる可能性があります。これにより、C はさまざまなアーキテクチャにコンパイルできる「不可知論的」言語であるという考えが打ち破られました。
int とは異なり、たとえば、char には常に明確に定義されたサイズがあります: 8 ビット、符号付き。その名前にもかかわらず、char はテキスト文字の抽象型ではありません。それは単なる 8 ビットの数値です。たとえば、リテラル 'a' は、コンパイル時に単純な数値 97 に変換されます。
では、ショートやロングなど、他のタイプについてはどうですか?アイデアは単純明快でした:
short <= int <= long
コンパイラーの実装者は、特定のサイズを完全に自由に決定できました。
ANSI C 標準では、いくつかのルールが確立されました。
この構成は役に立ちましたが、控えめに言っても、int のサイズは依然としてわかりにくいままでした。 C99 標準では stdint.h ヘッダーが導入され、状況は改善されました。
固定サイズの型ができました:
それ以降、このヘッダーを固定サイズの型で実装するかどうかはコンパイラ次第になりました。
現在、GCC や Clang などの最新のコンパイラーを使用すると、サイズはより予測しやすくなります。
Type | Size |
---|---|
char | 8 bits |
short | 16 bits |
int | 32 bits |
long | 64 bits (32 bits on 32-bit systems) |
long long | 64 bits |
ロングロングはまだ多少独特ではありますが、少なくとも一定の一貫性をもたらします (正直に言うと、ロングロングはスタイリッシュだとさえ思います)。
現在、stddef.h や stdint.h などのヘッダーが十分に装備されています。 main 関数の戻り値の型など、必要な場合にのみ int を使用します。プロトタイピング以外の場合は、stdint.h の固定サイズの整数を使用することを好み、配列インデックスまたはループの場合は、stddef.h の size_t を使用します。これで今後の頭痛の種が軽減されることを願っています。
ここまでお付き合いいただきありがとうございました。また次回お会いしましょう!
以上がC の整数: ちょっとした歴史の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。