Для чего используется "длинный" тип данных?

Я давно программирую на C++, и я довольно хорошо знаком с большинством вещей. Одна вещь, которую я никогда не понимал, это "длинный" тип данных.

Я погуглил это, но я все еще не знаю, для чего это. Я нашел страницы, которые говорят, что он того же размера и имеет тот же диапазон, что и int. Так какой смысл его использовать?

Здесь я нашел еще один вопрос переполнения стека: разница между типами данных long и int

И кажется, что единственное различие между ними состоит в том, что иногда размер отличается в разных системах. Означает ли это, что приложение, которое использует long на 64-битной машине, не будет работать на 32-битной машине? Если так, то не лучше ли вообще их не использовать?

Также я заметил материал, называемый "long int" или даже "long long"! Это тип данных или модификатор?

7 ответов

Это зависит от компилятора. Мои стандарты фу немного ржавые, но я считаю, что они определены следующим образом:

char <= short <= int <= long <= long long

где:

char      >= 8 bits
short     >= 16 bits
int       >= 16 bits
long      >= 32 bits
long long >= 64 bits

Это означает, что совершенно правильно иметь char = short = int = long = long long = 64bits и на самом деле компиляторы некоторых DSP разработаны таким образом.


Это подчеркивает важность фактического чтения документации вашего компилятора.

Я заметил материал, называемый "long int" или даже "long long"! Это тип данных или модификатор?

long int такой же как long (как только short int такой же как short).

long long это отдельный тип данных, представленный несколькими компиляторами и принятый в C++0x.

Обратите внимание, что нет такой вещи, как long long long:

error: 'long long long' is too long for GCC

С одного из ответов в вопросе вы связали:

Длина long должна быть как минимум того же размера, что и int, и, возможно, но не обязательно, long.

Я не могу придумать лучшего способа объяснить это.

long гарантировано (минимум) 32 бита. int гарантируется только (как минимум) 16 бит. в 16- и 8-битных системах long обеспеченный диапазон за счет эффективности.

ура & hth.,

Вот что говорит стандарт C++03 (3.9.1/2):

Существует четыре типа целых чисел со знаком: "знаковый символ", "короткое целое", "int" и "длинное целое". В этом списке каждый тип обеспечивает как минимум столько же памяти, сколько предшествует ему в списке.

Так: sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)

Вот что говорят стандарты C++0x (3.9.1/2) и C99 (6.2.5/4):

Существует пять стандартных целочисленных типов со знаком, обозначаемых как char со знаком, short int, int, long int и long long int.

  • long является синонимом long int
  • long long не существует в C++03, но будет в C++0x.

Я гуглил это, но я все еще не знаю, для чего это. Я нашел страницы, которые говорят, что он того же размера и имеет тот же диапазон, что и int. Так какой смысл его использовать?

Я удивился тому же. И пришел к выводу, что long сейчас бесполезно.

До появления 64-битных систем стандартом де-факто для целочисленных типов Си было:

  • char знак равноu)int8_t (Обратите внимание, что C предшествует Unicode.)
  • short знак равно int16_t
  • int знак равно intptr_t [до 64-битного], int_fast16_t
  • long знак равно int32_t [до 64-битного], intmax_t [до 1999 года]
  • long long знак равно int64_t или же intmax_t

Однако сегодня long не имеет последовательной семантики.

Если вам нужно целое число, которое гарантированно будет 32-битным или 64-битным, есть такие типы, например, int64_t. Если вы действительно хотите, чтобы ваш int был такого размера, используйте эти типы вместо long, long long и т. Д. Вам нужно будет включить cstdint для них (stdint.h в C).

Другие вопросы по тегам