В чем разница между "длинным", "длинным длинным", "длинным int" и "long long int" в С++?
Я перехожу из Java в С++ и задаю несколько вопросов о типе данных long
. В Java для хранения целого числа, превышающего 2 32 вы просто напишете 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
является необязательным.
Что касается разницы между этими двумя наборами, то стандарт С++ задает минимальные диапазоны для каждого и что long long
не менее ширины, чем long
.
Контрольные части стандарта (С++ 11, но это уже давно) являются, например, 3.9.1 Fundamental types
, раздел 2 (в следующем разделе приведены аналогичные правила для неподписанных интегральных типов):
Существует пять стандартных знаковых целых типов: подписанный char, short 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
.
Хотя сам стандарт С++ не указывает минимальные диапазоны интегральных типов, он ссылается на C99, 1.2 Normative references
, как применяемый. Следовательно, применимы минимальные диапазоны, изложенные в C99 5.2.4.2.1 Sizes of integer types <limits.h>
.
В терминах long double
это фактически значение с плавающей запятой, а не целое число. Подобно интегральным типам он должен иметь как минимум такую же точность, как и double
, и обеспечивать надмножество значений над этим типом (что означает, по крайней мере, эти значения, а не обязательно больше значений).
Ответ 2
Длинные и длинные int не менее 32 бит.
длинный длинный и длинный длинные int не менее 64 бит. Вы должны использовать компилятор c99 или лучше.
длинные парные разряды немного нечетные. Посмотрите их на Википедию для деталей.
Ответ 3
long
эквивалентен long int
, так же как short
эквивалентен short int
. A long int
представляет собой подписанный интегральный тип, который составляет не менее 32 бит, тогда как long long
или long long int
является подписанным интегральным типом не менее 64 бит.
Это не обязательно означает, что a long long
шире a long
. Многие платформы /ABI используют модель LP64
, где long
(и указатели) имеют ширину 64 бит. Win64 использует LLP64
, где long
все еще 32 бит, а long long
(и указатели) имеют ширину 64 бит.
Здесь есть хорошее резюме 64-битных моделей данных здесь.
long double
не гарантирует ничего другого, кроме как он будет как минимум шириной double
.
Ответ 4
Это выглядит запутанным, потому что вы принимаете long
как сам тип данных.
long
- это всего лишь сокращение для long int
, когда вы используете его в одиночку.
long
является модификатором, вы можете использовать его с double
также как long double
.
long
== long int
.
Оба они берут 4 байта.
Ответ 5
Исторически, в начале C раз, когда процессоры имели 8 или 16 бит длины слова, int
был идентичен сегодняшним short
(16 бит). В некотором смысле int является более абстрактным типом данных, чем char
, short
, long
или long long
, поскольку вы не можете быть уверены в битовой ширине.
При определении int n;
вы можете перевести это с помощью "дайте мне лучший компромисс в скорости и скорости на этом компьютере для n". Возможно, в будущем вы должны ожидать, что компиляторы переведут int
на 64 бит. Поэтому, когда вы хотите, чтобы ваша переменная имела 32 бита и не более, лучше использовать явный тип данных long
.
[Edit: #include <stdint.h>
представляется правильным способом обеспечения битрейтов с использованием типов int ## _ t, хотя он еще не является частью стандарта.]
Ответ 6
long int или long имеет размер 4 байта, тогда как long long или long long int имеет длину 8 байтов