В чем разница между "длинный", "длинный", "долгий интервал", и "длинный инт" в 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 (более поздний раздел дает аналогичные правила для неподписанных интегральные типы):существует пять стандартных целочисленных типов со знаком: 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, что на самом деле значение с плавающей точкой, а не целое число. Подобно целочисленным типам, требуется иметь по крайней мере такую же точность, как Adoubleи предоставить надмножество значений над этим типом (что означает по крайней мере эти значения, не обязательно больше значения).
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, гдеlongis еще 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, хотя это еще не часть стандарта.]