Я перехожу с Java на C ++ и у меня есть несколько вопросов о long
типе данных. В Java, чтобы держать целое число больше 2 32 , вы просто пишете long x;
. Однако в C ++ кажется, что long
это и тип данных, и модификатор.
Кажется, есть несколько способов использования long
:
long x;
long long x;
long int x;
long long int x;
Кроме того, кажется, есть такие вещи, как:
long double x;
и так далее.
В чем разница между всеми этими различными типами данных и имеют ли они одну и ту же цель?
c++
long-integer
1110101001
источник
источник
long long
может быть медленнее, чемlong
, который может быть медленнее, чемint
.Ответы:
long
иlong int
идентичны. Такlong long
и естьlong long int
. В обоих случаяхint
опционально.Что касается различия между двумя наборами, стандарт C ++ предписывает минимальные диапазоны для каждого, и это
long long
, по крайней мере, так же широко, какlong
.Контролирующие части стандарта (C ++ 11, но это было давно), например
3.9.1 Fundamental types
, раздел 2 (в следующем разделе приведены аналогичные правила для целых типов без знака):Также есть таблица 9
7.1.6.2 Simple type specifiers
, которая показывает «сопоставления» спецификаторов с реальными типами (показывая, что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
и предоставлять надмножество значений для этого типа (то есть, по крайней мере, те значения, а не обязательно больше значений).источник
unsigned
иunsigned int
long
по крайней мере 32 бита (2 ^ 31-1 по обе стороны от нуля) иlong long
по крайней мере 64 (2 ^ 63-1 по обе стороны).long double
гарантированно иметь хотя бы диапазонdouble
, но он может быть таким же. Это зависит от компьютера. Некоторые FPU обладают повышенной точностью; Чипы x87 имели 32-битную одинарную точность, 64-битную двойную точность и 80-битную расширенную точность.Длинное и длинное целое не менее 32 бит.
long long и long long int не менее 64 бит. Вы должны использовать компилятор c99 или лучше.
длинные пары немного странные. Ищите их в Википедии для деталей.
источник
long
эквивалентноlong int
, так же, какshort
эквивалентноshort int
. Along int
представляет собой целочисленный тип со знаком, который составляет по меньшей мере 32 бита, в то время как целочисленный тип со знакомlong long
илиlong long int
представляет собой по меньшей мере 64 бита.Это не обязательно означает, что а
long long
ширеlong
. Многие платформы / ABI используютLP64
модель - гдеlong
(и указатели) имеют ширину 64 бита. Win64 используетLLP64
, гдеlong
все еще 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 битам). В определенном смысле, внутр является более абстрактным типом данных , чемchar
,short
,long
илиlong long
, как вы не можете быть уверены в битовой.При определении
int n;
вы можете перевести это как «дайте мне лучший компромисс между битрейтом и скоростью на этой машине для n». Возможно, в будущем вы должны ожидать, что компиляторы будут переведеныint
на 64 бит. Поэтому, когда вы хотите, чтобы ваша переменная имела 32 бита и не более, лучше использовать явныйlong
тип данных.[Правка:
#include <stdint.h>
кажется правильным способом обеспечения битовой пропускной способности с использованием типов int ## _ t, хотя это еще не является частью стандарта.]источник
long
гарантированно , что a должно быть не менее 32 бит. (Стандарты могут измениться жестко.) В текущем проекте C ++ 14 просто сказано: @CM «Простые целые имеют естественный размер, предложенный архитектурой среды выполнения, остальные целочисленные типы со знаком предоставляются для удовлетворения особых потребностей» (раздел 3.9.1 ). Я не нашел ни слова о соотношении длин различных целых в нем. __int32 на самом деле не является частью стандарта, но, начиная с C ++ 11, доступны определения типов, такие как int_fast32_t или int_least32_t, чтобы получить именно то, что вы хотите.char
было почти единодушно 8 битов,short
16 иlong
32;int
может быть 16 или 32. Обратите внимание, что для некоторых платформ (особенно 68000) как 16-битные, так и 32-битныеint
были довольно распространены, и действительно, некоторые компиляторы имели варианты поддержки либо. Таким образом, ожидается, что код, который должен быть переносимым, будет использоватьshort
илиlong
предпочтительнееint
.В то время как в Java
long
всегда 64 бит, в C ++ это зависит от архитектуры компьютера и операционной системы . Например, along
- это 64-битная версия в Linux и 32-битная версия в Windows (это было сделано для обеспечения обратной совместимости, позволяя 32-битным программам компилироваться в 64-битной Windows без каких-либо изменений).Это считается хорошим стилем C ++, чтобы избежать
short int long ...
и вместо этого использовать:Эти (
int*_t
) могут быть использованы после включения<cstdint>
заголовка.size_t
находится в<stdlib.h>
.источник