Для чего используется «длинный» тип данных? - PullRequest
13 голосов
/ 02 декабря 2010

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

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

Я нашел другой вопрос переполнения стека относительно этого здесь: Разница между типами данных long и int

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

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

Ответы [ 7 ]

25 голосов
/ 02 декабря 2010

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

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 спроектированы таким образом.


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

20 голосов
/ 02 декабря 2010

Я заметил вещи, называемые "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
6 голосов
/ 02 декабря 2010

Из одного из ответов на вопрос, который вы связали:

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

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

5 голосов
/ 02 декабря 2010

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

ура и hth.,

4 голосов
/ 02 декабря 2010

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

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

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

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

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

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

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

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

До появления 64-битных систем стандарт de facto для целочисленных типов C был:

  • 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 не имеет согласованной семантики.

0 голосов
/ 02 декабря 2010

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

...