web-dev-qa-db-ja.com

ロング対Int C / C ++-ポイントは何ですか?

最近学んだように、C/C++のlongはintと同じ長さです。簡単に言えば、なぜですか?言語にデータ型を含めてもほとんど意味がないようです。 intにはない固有の用途がありますか? 64ビット整数を次のように宣言できることは知っています。

long long x = 0;

しかし、なぜ言語は単に長い井戸を作るのではなく、この方法でそれを行うことを選ぶのですか... intよりも長いのですか? C#などの他の言語がこれを行うので、なぜC/C++ではありませんか?

28
MGZero

CまたはC++で記述する場合、すべてのデータ型はアーキテクチャおよびコンパイラ固有です。 1つのシステムでは、intは32ですが、16または64であるものを見つけることができます。定義されていないため、コンパイラ次第です。

longintに関しては、標準整数が16ビットである場合、longは32ビット整数である場合、そして実際にはwasであるintより長い。

30
Griwes

具体的な保証は次のとおりです。

  • 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_tint_least32_t、およびint_fast16_tなどのタイプを定義します。これらはtypedefであり、通常は事前定義されたタイプのエイリアスとして定義されます。

必ずしもサイズと範囲の直接的な関係はありません。実装では、int 32ビットを作成できますが、他の8ビットでは、たとえば-2**23 .. +2^23-1のみの範囲でpadding bits)値に寄与していません。理論的には、intlongよりも大きい可能性があります(ただし、longが少なくとも範囲 as int。実際には、パディングビット、または2の補数以外の表現を使用する最新のシステムはほとんどありませんが、標準ではこのような奇妙なことが許可されています。

30
Keith Thompson

longは、intと同じ長さではありません。仕様によると、longは少なくともintと同じ大きさです。たとえば、GCCを使用するLinux x86_64では、sizeof(long)= 8、sizeof(int)= 4です。

18
arsenm

longintと同じサイズではなく、少なくともintと同じサイズです。 C++ 03標準(3.9.1-2)を引用するには:

「signed char」、「short int」、「int」、および「long int」の4つの符号付き整数型があります。このリストでは、各型は少なくともリストの前にあるものと同じくらいのストレージを提供します。プレーンintは、実行環境のアーキテクチャで提案されている自然なサイズです。他の符号付き整数型は、特別なニーズを満たすために提供されています。

これについての私の解釈は、「intを使用するだけですが、何らかの理由でニーズに合わず、より適切な別の一体型を見つけることができたら、ゲストになり、代わりにそれを使用してください」です。 longが優れている可能性がある1つの方法は、より長いアーキテクチャを使用している場合です。

13
Jon

まったく関係のないものを探し、これにつまずいて答える必要がありました。ええ、これは古いので、後でサーフィンする人にとっては...

率直に言って、ここでの答えはすべて不完全だと思います。

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などの型を使用して整数のサイズを直接設定することをサポートしているようです。

1
bueller