long
i long int
są identyczne. Podobnie jak long long
i long long int
. W obu przypadkach int
opcja jest opcjonalna.
Jeśli chodzi o różnicę między tymi dwoma zestawami, standard C ++ nakazuje minimalne zakresy dla każdego, a long long
to co najmniej tak szeroki jak long
.
Kontrolujące części standardu (C ++ 11, ale to już istnieje od dłuższego czasu) to, na przykład 3.9.1 Fundamental types
, sekcja 2 (późniejsza sekcja podaje podobne reguły dla niepodpisanych typów całek):
Istnieje pięć standardowych typów liczb całkowitych ze znakiem: znak, char, short int, int, long int i long long int. Na tej liście każdy typ zapewnia co najmniej tyle miejsca, ile poprzedza go na liście.
Jest też tabela 9, w 7.1.6.2 Simple type specifiers
której pokazano „odwzorowania” specyfikatorów na rzeczywiste typy (pokazujące, że int
opcja jest opcjonalna), której sekcja pokazano poniżej:
Specifier(s) Type
------------- -------------
long long int long long int
long long long long int
long int long int
long long int
Zwróć uwagę na różnicę między specyfikatorem a typem. Specyfikator to sposób, w jaki informujesz kompilator, jaki jest typ, ale możesz użyć różnych specyfikatorów, aby uzyskać ten sam typ.
Dlatego sam long
w sobie nie jest typem ani modyfikatorem, jak stawia twoje pytanie, jest po prostu specyfikatorem long int
typu. To samo dotyczy long long
bycia specyfikatorem long long int
typu.
Chociaż sam standard C ++ nie określa minimalnych zakresów typów całkowych, cytuje C99 1.2 Normative references
, jak to ma zastosowanie. Dlatego obowiązują minimalne zakresy określone w C99 5.2.4.2.1 Sizes of integer types <limits.h>
.
Z punktu widzenia long double
tego jest to właściwie liczba zmiennoprzecinkowa, a nie liczba całkowita. Podobnie jak w przypadku typów całkowych, wymagana jest co najmniej tyle samo precyzji co a, double
a także zapewnienie zestawu wartości nad tym typem (co najmniej te wartości, niekoniecznie więcej wartości).