私は Java から C++ に移行していますが、データ型についていくつか質問があります。Java では、 2 32long
より大きい整数を保持するには、 と記述するだけです。しかし、C++ では、 はデータ型と修飾子の両方であるようです。long x;
long
使い方はいくつかあるようですlong
:
long x;
long long x;
long int x;
long long int x;
また、以下のようなこともあるようです。
long double x;
等々。
これらすべてのさまざまなデータ タイプの違いは何ですか。また、それらはすべて同じ目的を持っていますか。
ベストアンサー1
long
と はlong int
同一です。long long
とも同様ですlong 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 つがあります。このリストでは、各型は、リスト内の先行する型と少なくとも同じ量のストレージを提供します。
7.1.6.2 Simple type specifiers
には、指定子と実際の型との「マッピング」を示す表 9 もあり( は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 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
値を意味するわけではありません)を提供する必要があります。