C ++の「long」、「long long」、「long int」、および「long long int」の違いは何ですか?


209

JavaからC ++に移行していますが、longデータ型についていくつか質問があります。Javaでは、2 32より大きい整数を保持するには、次のように記述しlong x;ます。ただし、C ++では、これはlongデータ型と修飾子の両方です。

いくつかの使用方法があるようlongです:

long x;
long long x;
long int x;
long long int x;

また、次のようなものがあるようです:

long double x;

等々。

これらのさまざまなデータ型の違いは何ですか?それらはすべて同じ目的を持っていますか?



2
@ user2612743-安全のために、要件を検討し、適切なタイプを使用してください。long longより遅いかもしれませんlong、それはより遅いかもしれませんint
ピートベッカー


1
いいえ、「安全であること、長く長く使用すること」は、「安全であるために、みんなに地球のエイズを1つ与えるだけでよいので、安全なセックスについて心配する必要はありません。愚かな、違う?データとそのデータに可能な値について考え、最適なタイプを使用してください。これは、ターゲットプラットフォームの本来のビット幅より大きい数値を処理するために追加のライブラリーをロードする必要がある場合など、コンパイラーが元のコードの意図を損なうことなく追加の最適化を行うのにも役立ちます。
CM

win32リストボックスなどでlong longを使用しても、制限に違反していなくても、メモリやその他の変数を破壊することはできません。無害に見えるC4244警告があっても、簡単に検出することはできません。
Laurie Stearn、2016

回答:


182

longlong int同一です。そうしているlong longlong long int。どちらの場合も、intはオプションです。

2つのセットの違いについては、C ++標準ではそれぞれの最小範囲が義務付けられており、それlong long少なくともと同じlongです。

標準の制御部分(C ++ 11ですが、これは長い間使用されてきました)は3.9.1 Fundamental types、セクション2です(後のセクションでは、符号なし整数型について同様の規則を示します)。

標準の符号付き整数型には、signed char、short int、int、long int、long long intの5つがあります。このリストでは、各タイプは、少なくともリストの前のタイプと同じ量のストレージを提供します。

の表9もあり7.1.6.2 Simple type specifiers、これは指定子の実際のタイプへの「マッピング」を示しています(intがオプションであることを示しています)。そのセクションを以下に示します。

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

指定子とタイプの違いに注意してください。指定子は、コンパイラーに型を指定する方法ですが、異なる指定子を使用して同じ型にすることができます。

したがってlong、それ自体は、あなたの質問が示唆するようにタイプで修飾子でもありません、それは単にlong intタイプの指定子です。同上long longlong long intタイプの指定子であることについて、。

C ++標準自体は、整数型の最小範囲を指定していませんが1.2 Normative references、C99 を適用として引用しています。したがって、に記載されてC99 5.2.4.2.1 Sizes of integer types <limits.h>いる最小範囲が適用されます。


に関してはlong double、これは実際には整数ではなく浮動小数点値です。整数型と同様に、少なくともa doubleと同じ精度を持ち、その型に対して値のスーパーセットを提供する必要があります(少なくともこれらの値を意味ますが、必ずしもより多くの値を意味するわけではありません)。


4
unsignedandと同じことunsigned int
Kal

2
私はlong少なくとも32ビット(ゼロの両側に2 ^ 31-1)でlong longあり、少なくとも64 ビット(両側に2 ^ 63-1 )であると確信しています。
2013

2
またlong double、少なくともの範囲doubleがあることが保証されていますが、同じであることもあります。それはコンピュータに依存します。一部のFPUは拡張精度を備えています。x87チップには、32ビットの単精度、64ビットの倍精度、および80ビットの拡張精度がありました。
Eric Jablow 2013

範囲の要件については、C ++ 11標準は実際の範囲を持つC11標準を参照します。
クリス2013

「int」の部分は、整数型と浮動小数点、文字、またはその他の非整数型を区別するだけです。多くの場合、これはコンパイラによって推測されるため、削除できます。たとえば、「unsigned」が「unsigned int」と同じになるのはこのためです。プログラマが「char」や「double」などの他のものを指定しない限り、「int」の部分は単純に想定されます。使用される実際のサイズについては、どの標準を読み取るかによって、各サイズのビット数は最小になる場合がありますが、それらはすべて、それぞれが少なくとも前のタイプと同じ大きさになるように定義されています。
CM


17

long相当しlong int、同じように、shortと同等ですshort int。Aは、long intある符号付き整数型であり、少なくとも 32ビット、一方long longまたはlong long int符号付き整数型である少なくとも 64ビット。

これは、必ずしもa long longがより大きいことを意味するわけではありませんlong。多くのプラットフォーム/ ABIはLP64モデルを使用しています-ここでlong(およびポインター)は64ビット幅です。Win64のは、使用するLLP64場合、long依然として32ビットであり、そしてlong long(およびポインタも)64ビット幅です。

ここに64ビットデータモデルの良い要約があります

long double少なくともと同じ幅になること以外は、多くのことを保証しませんdouble


7

あなたが取っているので、これは混乱しているように見えます long、データ型自体ている。

long の省略形にすぎません long int単独で使用する場合。

long修飾子です。次のようにdoubleも使用できますlong double。。

long== long int

どちらも4バイトかかります。


4バイトを長く取るのはWin64でのみ有効で、プラットフォームに依存します
Prodigle

1
確かに...長いだけでなく... intは4バイトかかり、2バイトはプラットフォームに依存することは間違いありません。
シラジアラム

3

歴史的に、初期のC時代では、プロセッサのワード長が8ビットまたは16ビットintでしたが、今日short(16ビット)と同じでした。ある意味では、int型は、より多くの抽象データ型であるcharshortlongまたはlong longあなたがビット幅について確認することはできませんとして、。

定義するときにint n;、「このマシンでのnのビット幅と速度の最高の妥協点を教えてください」と翻訳できます。おそらく将来的には、コンパイラintが64ビットに変換することを期待する必要があります。したがって、変数を32ビット以上にしたくない場合はlong、データ型として明示を使用することをお勧めします。

[編集:#include <stdint.h>int ## _ t型を使用してビット幅を確保する適切な方法のようですが、まだ標準には含まれていません。]


2
最後の部分、intが64ビットのときに「long」を使用して32ビットを取得するのは正しくありません。intが64ビットの場合、longも少なくとも 64ビットになります。Longは少なくとも intと同じ大きさであることが保証されていますが、それより大きくなることはありますが、決して小さくなることはありません。ほとんどのコンパイラーには、プログラマーをより具体的にするためのさまざまなメソッドがあります。たとえば、正確に32ビットである(移植できない)__int32型などです。
CM

1
C規格で定義されているように、a long少なくとも 32ビットであることが保証されています。(標準は厳しく変更される可能性があります。)現在のC ++ 14ドラフトでは、@ CMと述べています。 )。さまざまなintの長さの関係については何も知りませんでした。__int32は実際には標準の一部ではありませんが、C ++ 11以降、int_fast32_tやint_least32_tなどのtypedefを使用して、必要なものを正確に取得できます。
thomiel

私は、汎用の再プログラム可能なマイクロコンピュータのための20世紀の実装に、と言うだろうchar、ほとんど満場一致で8ビットだったshort16だった、とlong32でした。int一部のプラットフォーム(特に68000)では、16ビットと32ビットの両方intが非常に一般的であり、実際に一部のコンパイラーはどちらかをサポートするオプションがありました。したがって、移植可能である必要があるコードは、を使用するshortlong、それよりも優先されintます。
スーパーキャット2016年

0

Javaではa longは常に64ビットですが、C ++ではこれはコンピューターのアーキテクチャーとオペレーティングシステムに依存します。たとえば、longはLinuxでは64ビット、Windowsでは32ビットです(これは、下位互換性を維持するために行われたもので、32ビットプログラムを変更せずに64ビットWindowsでコンパイルできるようにします)。

回避 short int long ...して代わりに使用することは、優れたC ++スタイルと見なされます。

std::int8_t   # exactly  8 bits
std::int16_t  # exactly 16 bits
std::int32_t  # exactly 32 bits
std::int64_t  # exactly 64 bits

std::size_t   # can hold all possible object sizes, used for indexing

これら(int*_t)は、<cstdint>ヘッダーを組み込んだ後に使用できます。size_tにあり<stdlib.h>ます。

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