В чем разница между "длинным", "длинным длинным", "длинным 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 байтов