long
і long int
однакові. Так є long long
і long long int
. В обох випадках int
опція є необов’язковою.
Що стосується різниці між двома наборами, стандарт C ++ передбачає мінімальні діапазони для кожного, і long long
це як мінімум настільки ж широке, як long
.
Контролюючі частини стандарту (C ++ 11, але це існує вже давно) - це 3.9.1 Fundamental types
розділ 2 (пізній розділ містить подібні правила для непідписаних цілісних типів):
Існує п'ять стандартних цілих цілих типів: підписаний char, короткий int, int, long int і long long int. У цьому списку кожен тип забезпечує принаймні стільки пам’яті, скільки й попередній у списку.
Також є таблиця 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 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
і забезпечити надмножину значень над цим типом ( маючи на увазі принаймні ці значення, не обов'язково більше значень).