Для чего используется "длинный" тип данных?
Я давно программирую на 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).