В чем разница между "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, хотя это еще не часть стандарта.]