私は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;
等々。
これらのさまざまなデータ型すべての違いは何ですか?また、それらはすべて同じ目的を持っていますか?
long
とlong int
は同一です。 long long
とlong long int
もそうです。どちらの場合も、int
はオプションです。
2つのセットの違いについては、C++標準ではそれぞれに最小範囲が義務付けられており、long long
はlong
と同じ 少なくとも の幅になります。
標準の制御部分(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 long
がlong 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を意味する)。
Longとlong intは少なくとも32ビットです。
long longおよびlong long intは少なくとも64ビットです。あなたはc99以上のコンパイラを使用している必要があります。
ロングダブルは少し変です。 詳細はWikipediaで調べてください。
long
がlong int
と同等であるのと同様に、short
はshort int
と同等です。 long int
は 少なくとも 32ビットの符号付き整数型で、long long
またはlong long int
は符号付き整数型の 少なくとも 64ビットです。
これは必ずしもlong long
がlong
より広いという意味ではありません。多くのプラットフォーム/ ABIはLP64
モデルを使用します - ここでlong
(およびポインタ)は64ビット幅です。 Win64はLLP64
を使用します。ここでlong
は32ビット、long long
(およびポインタ)は64ビット幅です。
64ビットデータモデルの良い要約があります ここ 。
long double
は、 少なくとも がdouble
と同じ幅になること以外に、それほど保証するものではありません。
あなたはlong
をデータ型そのものとして取っているので、これは混乱します。
long
はあなたが単独でそれを使っているときのlong int
の単なる略記です。
long
は修飾子です。double
と一緒にlong double
としても使用できます。
long
== long int
。
両方とも4バイトかかります。
歴史的には、Cの初期の時代に、プロセッサが8または16ビットのワード長を持っていたとき、int
は今日のshort
(16ビット)と同一でした。ある意味では、intはchar
、short
、long
またはlong long
よりも抽象的なデータ型です。ビット幅についてはよくわからないからです。
int n;
を定義するとき、これを「このマシンでのビット幅と速度の妥協点をnにしてください」と言い換えることができます。将来的には、コンパイラはint
を64ビットに変換するようになるはずです。そのため、変数に32ビット以上の値を持たせたい場合は、データ型としてexplicitlong
を使用することをお勧めします。
[編集:#include <stdint.h>
はint ## _ t型を使ってビット幅を確保するための適切な方法のようですが、まだ標準の一部ではありません。]