web-dev-qa-db-ja.com

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

私はJavaからC++に移行しつつあり、longデータ型についていくつか質問があります。 Javaでは、2より大きい整数を保持する32long x;と書くだけです。しかし、C++では、longはデータ型でもあり修飾子でもあるようです。

longを使うにはいくつかの方法があるようです。

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

また、次のようなことがあるようです。

long double x;

等々。

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

154
1110101001

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

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

標準の制御部分(C++ 11、これは長い間使われてきました)は、3.9.1 Fundamental types、section 2です(後の節で符号なし整数型についても同様の規則があります)

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

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

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


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

144
paxdiablo

Longとlong intは少なくとも32ビットです。

long longおよびlong long intは少なくとも64ビットです。あなたはc99以上のコンパイラを使用している必要があります。

ロングダブルは少し変です。 詳細はWikipediaで調べてください。

50
Eric Lippert

longlong intと同等であるのと同様に、shortshort intと同等です。 long int 少なくとも 32ビットの符号付き整数型で、long longまたはlong long intは符号付き整数型の 少なくとも 64ビットです。

これは必ずしもlong longlongより広いという意味ではありません。多くのプラットフォーム/ ABIはLP64モデルを使用します - ここでlong(およびポインタ)は64ビット幅です。 Win64はLLP64を使用します。ここでlongは32ビット、long long(およびポインタ)は64ビット幅です。

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

long doubleは、 少なくとも doubleと同じ幅になること以外に、それほど保証するものではありません。

13
Brett Hale

あなたはlongをデータ型そのものとして取っているので、これは混乱します。

longはあなたが単独でそれを使っているときのlong intの単なる略記です。

longは修飾子です。doubleと一緒にlong doubleとしても使用できます。

long == long int

両方とも4バイトかかります。

7
Siraj

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

int n;を定義するとき、これを「このマシンでのビット幅と速度の妥協点をnにしてください」と言い換えることができます。将来的には、コンパイラはintを64ビットに変換するようになるはずです。そのため、変数に32ビット以上の値を持たせたい場合は、データ型としてexplicitlongを使用することをお勧めします。

[編集:#include <stdint.h>はint ## _ t型を使ってビット幅を確保するための適切な方法のようですが、まだ標準の一部ではありません。]

3
thomiel