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

5 ответов:

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

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

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

существует пять стандартных целочисленных типов со знаком: signed 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 тип.

хотя сам стандарт C++ не определяет минимальные диапазоны интеграла типы, он цитирует C99, в 1.2 Normative references, как применение. Следовательно, минимальные диапазоны, как указано в C99 5.2.4.2.1 Sizes of integer types <limits.h> применимы.


С точки зрения long double, что на самом деле значение с плавающей точкой, а не целое число. Подобно целочисленным типам, требуется иметь по крайней мере такую же точность, как A double и предоставить надмножество значений над этим типом (что означает по крайней мере эти значения, не обязательно больше значения).

Long и long int - это не менее 32 бит.

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

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