В чем разница между "long", "long long", "long int" и "long long int" в C++?

Я перехожу с Java на C++ и у меня есть некоторые вопросы о long тип данных. В Java для хранения целого числа больше 232, вы можете просто написать long x;. Однако, в C++, кажется, что long как тип данных и модификатор.

существует несколько способов использования long:

long x;
long long x;
long int x;
long long int x;

также, кажется, есть такие вещи, как:

long double x;

и так далее.

в чем разница между всеми из этих различных типов данных, и все они имеют одну и ту же цель?

5 ответов


long и long int идентичны. Так long long и long long int. В обоих случаях int является необязательным.

что касается разницы между двумя наборами, стандарт C++ предписывает минимальные диапазоны для каждого, и это long long на меньше как long.

контролирующей части стандарта (C++11, но это было вокруг в течение долгого времени), например, 3.9.1 Fundamental types, раздел 2 (более поздний раздел дает аналогичные правила для неподписанных интегральные типы):

существует пять стандартных подписал целочисленных типов : со знаком типа char, короткие инт, инт, Лонг Инт, и длинный инт. В этом списке каждый тип предоставляет по крайней мере столько же хранилища, сколько и предыдущие в списке.

есть также Таблица 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 и предоставить надмножество значений над этим типом (что означает по крайней мере эти значения, не обязательно больше значения).


Long и long int не менее 32 бит.

долгий и длинный инт не менее 64 бит. Вы должны использовать компилятор c99 или лучше.

длинные пары немного странные. посмотрите их в Википедии для деталей.


long эквивалентно long int, так как short эквивалентно short int. А long int - это знаковый тип, то есть по крайней мере 32 бита, в то время как long long или long long int является знаковым интегральным типом по крайней мере 64 бит.

это не обязательно означает, что a long long шире, чем long. Многие платформы / ABIs используют LP64 модель - где long (и указатели) имеют ширину 64 бита. Х64 использует LLP64, где long is еще 32 бита, и long long (и указатели) имеют ширину 64 бита.

есть хорошее резюме 64-разрядных моделей данных здесь.

long double не гарантирует много другого, чем это будет по крайней мере шириной с double.


это выглядит запутанным, потому что вы принимаете long как сам тип данных.

long Это не что иное, как стенография для long int когда вы используете его в покое.

long - Это модификатор, вы можете использовать его с double и как long double.

long ==long int.

оба они занимают 4 байта.


исторически, в ранние времена C, когда процессоры имели 8 или 16 бит длины слова,intбыл идентичен сегодняшним short(16 бит). В определенном смысле int является более абстрактным типом данных, чемchar,short,longилиlong long, а вы не можете быть уверены в битовой полосой пропускания.

при определенииint n;вы можете перевести это с помощью "дайте мне лучший компромисс bitwidth и скорости на этой машине для n". Возможно, в будущем вы должны ожидать, что компиляторы переведутintна 64 немного. Поэтому, когда вы хотите, чтобы ваша переменная имела 32 бита и не более, лучше использовать явноеlongтип данных.

[Edit:#include <stdint.h> кажется правильным способом обеспечения битовой ширины с использованием типов int##_t, хотя это еще не часть стандарта.]