最近学んだように、C/C++のlongはintと同じ長さです。簡単に言えば、なぜですか?言語にデータ型を含めてもほとんど意味がないようです。 intにはない固有の用途がありますか? 64ビット整数を次のように宣言できることは知っています。
long long x = 0;
しかし、なぜ言語は単に長い井戸を作るのではなく、この方法でそれを行うことを選ぶのですか... intよりも長いのですか? C#などの他の言語がこれを行うので、なぜC/C++ではありませんか?
CまたはC++で記述する場合、すべてのデータ型はアーキテクチャおよびコンパイラ固有です。 1つのシステムでは、intは32ですが、16または64であるものを見つけることができます。定義されていないため、コンパイラ次第です。
long
とint
に関しては、標準整数が16ビットである場合、long
は32ビット整数である場合、そして実際にはwasであるint
より長い。
具体的な保証は次のとおりです。
char
は少なくとも8ビット(定義により1バイトですが、ビット数は多くなります)short
は少なくとも16ビットですint
は少なくとも16ビットですlong
は少なくとも32ビットですlong long
(それをサポートする言語のバージョン)は少なくとも64ビットですしたがって、少なくとも32ビットの型が必要な場合はlong
を使用し、少なくとも16ビットの適度に高速な型が必要な場合はint
を使用するのが理にかなっています。
実際、少なくともCでは、これらの下限はサイズではなく範囲で表されます。たとえば、言語ではINT_MIN <= -32767
およびINT_MAX >= +32767
が必要です。 16ビットの要件は、これと整数がバイナリで表されるという要件から得られます。
C99は<stdint.h>
および<inttypes.h>
を追加します。これらは、uint32_t
、int_least32_t
、およびint_fast16_t
などのタイプを定義します。これらはtypedefであり、通常は事前定義されたタイプのエイリアスとして定義されます。
(必ずしもサイズと範囲の直接的な関係はありません。実装では、int
32ビットを作成できますが、他の8ビットでは、たとえば-2**23 .. +2^23-1
のみの範囲でpadding bits)値に寄与していません。理論的には、int
がlong
よりも大きい可能性があります(ただし、long
が少なくとも範囲 as int
。実際には、パディングビット、または2の補数以外の表現を使用する最新のシステムはほとんどありませんが、標準ではこのような奇妙なことが許可されています。
longは、intと同じ長さではありません。仕様によると、longは少なくともintと同じ大きさです。たとえば、GCCを使用するLinux x86_64では、sizeof(long)= 8、sizeof(int)= 4です。
long
はint
と同じサイズではなく、少なくともint
と同じサイズです。 C++ 03標準(3.9.1-2)を引用するには:
「signed char」、「short int」、「int」、および「long int」の4つの符号付き整数型があります。このリストでは、各型は少なくともリストの前にあるものと同じくらいのストレージを提供します。プレーンintは、実行環境のアーキテクチャで提案されている自然なサイズです。他の符号付き整数型は、特別なニーズを満たすために提供されています。
これについての私の解釈は、「int
を使用するだけですが、何らかの理由でニーズに合わず、より適切な別の一体型を見つけることができたら、ゲストになり、代わりにそれを使用してください」です。 long
が優れている可能性がある1つの方法は、より長いアーキテクチャを使用している場合です。
まったく関係のないものを探し、これにつまずいて答える必要がありました。ええ、これは古いので、後でサーフィンする人にとっては...
率直に言って、ここでの答えはすべて不完全だと思います。
Longのサイズは、プロセッサが一度に操作できるビット数のサイズです。 「単語」とも呼ばれます。 「ハーフワード」は短いです。 「ダブルワード」はlong longで、longの2倍の大きさであり(元々はベンダーによってのみ実装され、標準ではありませんでした)、long longよりも大きいのはlong longの2倍のサイズの「quadword」ですしかし、正式な名前はありませんでした(実際には標準ではありませんでした)。
さて、intはどこから来ますか?一部はプロセッサに、一部はOSに登録します。レジスタは、CPUが処理するネイティブサイズを定義し、CPUがショートやロングなどのサイズを定義します。また、プロセッサは、動作するのに最も効率的なサイズであるデータサイズで設計されています。それはintであるべきです。
今日の64ビットマシンでは、longはWordであり、64ビットマシン上のWordは64ビットであるため、プロセッサが処理するように設計されているものは何でもlongは64ビットとintになりますが、そうでない場合もあります。どうして? OSがデータモデルを選択し、これらのデータサイズを定義しました(構築方法によります)。最終的に、Windows(およびWin64を使用)を使用している場合、longとintの両方で32ビットになります。 SolarisとLinuxは異なる定義を使用します(長いのは64ビットです)。これらの定義は、ILP64、LP64、LLP64などと呼ばれます。 WindowsはLLP64を使用し、SolarisとLinuxはLP64を使用します。
モデルILP64 LP64 LLP64 int 64 32 32 long 64 64 32 pointer 64 64 64 long long 64 64 64
ここで、たとえば、ILPはint-long-pointerを意味し、LLPはlong-long-pointerを意味します
これを回避するために、ほとんどのコンパイラは、int32やint64などの型を使用して整数のサイズを直接設定することをサポートしているようです。