なぜCでshort、int、longが発明されたのですか?


16

私は作成の正確な目的何であったか、トラブルの理解を抱えているshortintlongCのデータ型を?

私が尋ねる理由は、サイズが制限されているようには見えないことです- たとえば、shortより小さい限り、どんなサイズでも構いませんint

では、バイナリの互換性が望めない場合、どのような状況で、たとえばの代わりにunsigned intまたはを使用する必要がありますか?unsigned longsize_t

(サイズがわからない場合は、どれをいつ選択するかをどのように知りますか?)


2
チェックアウト<stdint.h>
ブラックジャック

1
@BlackJack:はい、はい、私は実際に持っています-しかし、私の質問は、なぜこれらのタイプがすべてネイティブに定義されていないのでしょうか?「後知恵は20/20」の問題ですか、それとも特定の理由がありましたか?
Mehrdad

2
Cは、移植性があり、基礎となるハードウェアに近いことを目的としていました。バイトが8ビット長ではないプラットフォームがありましたが、それでもCを使用できました。データ型の固定セットでは十分ではなく、固定サイズの整数は移植できませんでした。
SKロジック

@ SK-logic:彼らが言っsizeof(short) == 2 * sizeof(char)たり似たりしても
Mehrdad

1
プラットフォームがありsizeof(char) == sizeof(short)、それは理にかなっています。残念ながら、すべて の可能なプラットフォームと既存のプラットフォームに適合するように整数型を指定する方法はありません。
SKロジック

回答:


12

使用しているアーキテクチャによって定義されます。Zilog z80チップ(一般的な組み込みチップ)では1つのサイズになりますが、x86チップセットではまったく異なるサイズになる可能性があります。ただし、サイズ自体は互いに固定された比率です。基本的にshortとlongは型ではありませんが、int型に適しています。短い整数は(通常の)整数より1桁小さく、長い整数は1桁大きくなります。Intが4バイトに制限されているとしましょう。短い修飾子は4バイトに制限しますが、2バイトも非常に一般的で、長い修飾子は潜在的に8バイトにブーストしますが、4バイトに減らすこともできます。これは単語の長さにも影響されることに注意してください。32ビットシステムでは、いずれにせよintあたり4バイトで最大になり、とにかく通常のintと同じ長さになります。したがって、Short≤Int≤Longです。

ただし、もう一度長くすると、intを次のセルにプッシュして、8バイトのストレージを確保できます。これは64ビットマシンのワードサイズであるため、そのようなことを心配する必要はなく、1つのセルをlong intに使用するだけで、long long intが実際にビットを取得しながら、標準intを超える別の順序になります。

どちらを選択するかについては、たとえばJavaプログラマーが心配する必要のないものに要約されます。「あなたのアーキテクチャは何ですか?」問題のマシンのメモリのワードサイズにすべて依存するため、どちらを使用するかを決める前に、事前にそれを理解する必要があります。次に、メモリ内のすべてのビットを使用するかどうかに関係なくメモリが割り当てられるため、できる限り多くのメモリを節約するために、適切な最小サイズを選択します。そのため、できる場所を保存し、できる場合はショートパンツを、できない場合はイントを選択し、通常のイントよりも大きいものが必要な場合は選択します。天井という言葉が出るまで、必要に応じて延長します。次に、多数のルーチンを提供するか、ライブラリから取得する必要があります。

Cはおそらく「ポータブルアセンブリ」かもしれませんが、まだハードウェアを知っている必要があります。


11
これはまったく正しくありません。ショートパンツはintより小さくする必要はありません。intより大きくすることはできません
jk。

修正します。
世界エンジニア

2
同様に、longsはintより小さくすることはできません。
ドナルドフェロー

1
実際、短いマシン、intマシン、長いマシンはまったく同じ場所にあったと思います。
jk。

6

今日では、「バイト」は「8ビット」を意味しますが、常にそうであるとは限りませんでした。マシンは、アドレス指定可能な4ビット、8ビット、12ビット、16ビット、32ビット、および36ビットのチャンク(およびおそらく他のサイズも)を使用しました。Cの設計意図の1つは、異なるメモリサイズと構成のマシンで使用できるようにすることでした。

設計の意図はもともと、各タイプ以外intのさまざまなサイズの数を処理できる最小のものでintあり、+ /-32767を処理できる最も実用的な「汎用」サイズであったと思います。コンピューターが非常に強力になり、64ビット数の操作が小さい数字の操作と同じになったときにまだ使用されている言語を作成したいという希望や意図はなかったと思います。

Cの整数型のセマンティクスの最大の問題は、一部のコンテキストでは基数または数学的整数を表すのに対し、他のコンテキストでは整数の一致するmod 2 ^ nのラッピング抽象代数リングのメンバーを表すために使用されることです。 0からの最大表現可能値は1を生成するように定義されています]が、動作は、コンピューターのワードサイズが16ビット前後(および36ビットのワードサイズが巨大だった場合) )、64ビットマシンで意味をなすものに基づいてではなく。その結果、小さい符号なし32ビット値から32ビット符号なし値を減算した結果は、大きな32ビット符号なし値、または負の64ビット数のいずれかです。


4

/programming/589575/size-of-int-long-etc

したがって、最も一般的に使用されるアーキテクチャでは、charは1バイト、shortとintは少なくとも2バイト、longは少なくとも4バイトです。

そして、「int」は、現在のCPUにとって最も自然/通常/効率的な表現であることが意図されています。

したがって、一般的なルールは、値が+/- 32Kを超えない限り「int」を使用し、(古いCPUでは)「long」を使用することです。...または、小さな値(<32K)の大きな配列を作成していて、メモリが問題にならない限り、「short」を使用してメモリ(または「char」または「byte」)を保存します。


2
しかし、64ビットでintは、良い選択となることはほとんどありませんか?とにかく、コードを移植する際の問題を回避するために、ほとんどの場合、とにかくsize_t(またはptrdiff_t!)
Mehrdad

@Merhdad-intは、HWの「標準単位」であることが定義されていた最適な選択であり、通常はポインターのサイズです。現在、安全のためにsize_tを使用しています。
マーティンベケット

1

Cは、さまざまなレベルでメモリを積極的に扱うように設計されました。メモリの制約、アーキテクチャなどのために、short、int、long、floatとdoubleの違いが問題になる場合があります。今ではそれほど重要ではありませんが、それを行う環境(埋め込み、データが大量の場合)、主に32ビットアーキテクチャから64ビットへの移行により、再び問題が発生します。(128ビットアーキテクチャに移行し、C / C ++がまだ普及している10〜20年後には、再び問題になります)。バイナリの互換性が損なわれているのは正しいことです。そのため、これらの変数型のサイズを重要なところで使用したくないのです。

サイズがわからない場合にどの方法を使用するかを尋ねましたが、特定のアーキテクチャ/コンパイラの組み合わせでサイズを知っているので、そのレベルでメモリを最適化する必要がある場合は、それを知っている方が良いでしょう。プラットフォームを単純に最適化することはできません。プラットフォームのサイズがわからないため、その目的でこれらの機能を使用したくないためです。しかし、Cで書かれたものの多くはプラットフォーム固有のものであり、「クロスプラットフォーム」の流行にもかかわらず、いくつかの有利な最適化を可能にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.