Могу ли я предположить, что размер long int всегда составляет 4 байта?
это всегда правда, что long int (который насколько я понимаю является синонимом long) составляет 4 байт?
могу ли я на это положиться? Если нет, Может ли это быть верно для ОС на основе POSIX?
9 ответов:
стандарты ничего не говорят о точном размере любых целочисленных типов, кроме
char. Как правило,long32-бит на 32-битных системах и 64-бит на 64-битных системах.однако в стандарте указывается минимум размер. Из раздела 5.2.4.2.1 Стандарт C:
1 значения, приведенные ниже, должны быть заменены постоянными выражениями подходит для использования в
#ifпредобработки директивы. Более того, кромеCHAR_BITиMB_LEN_MAXдолжны быть заменяется выражениями, которые имеют тот же тип, что и выражение, представляющее собой преобразованный объект соответствующего типа в соответствии с целочисленными акциями. их реализации значения должны быть равны или больше по величине (абсолютной величине), чтобы те, что показаны, с тем же знаком....
минимум значение для объекта типа
long int
LONG_MIN-2147483647 // -(2^31-1)максимальное значение для объекта типа
long int
LONG_MAX+2147483647 // 2^31-1это говорит, что a
long intдолжны минимум 32 бита, но может быть больше. На машине, гдеCHAR_BIT8, это дает минимальный размер байта 4. Однако дальше машина с например,CHAR_BITравно 16, along intможет быть 2 байта.вот реальный пример. Для следующего кода:
#include <stdio.h> int main () { printf("sizeof(long) = %zu\n", sizeof(long)); return 0; }вывод на Debian 7 i686:
sizeof (long) = 4
выход на CentOS 7 x64:
sizeof (long) = 8
так нет, вы не можете делать никаких предположений о размере. Если вам нужен тип определенного размера, вы можете использовать типы, определенные в
stdint.h. Он определяет следующие типы:
int8_t: подпись 8-битuint8_t: без знака 8-битint16_t: 16-битовогоuint16_t: без знака 16-битint32_t: 32-разряднымuint32_t: unsigned 32-bitint64_t: подписано 64-битuint64_t: без знака 64-битThe
stdint.hзаголовок описан в разделе 7.20 стандартный, с точными типами ширины в разделе 7.20.1.1. Стандарт утверждает, что эти типы являются необязательными, но они существуют в большинстве реализаций.
нет, ни стандарт C, ни POSIX не гарантируют этого и фактически большинство Unix-подобных 64-битных платформ есть 64 бит (8 байт)
long.
использовать код
sizeof(long int)и проверьте размер. Это даст вам размер long int в байтах в системе, с которой вы работаете в настоящее время. Ответ на ваш вопрос, в частности, нет. Это нигде не гарантируется в C или в POSIX или где угодно.
как указал @delnan, реализации POSIX сохраняют размер
longиintкак не указано, и он часто отличается между 32-битными и 64-битными системами.длина
longв основном оборудование related (часто соответствует размеру регистров данных на ЦП, а иногда и другим связанным с программным обеспечением вопросам, таким как дизайн ОС и интерфейс ABI).чтобы облегчить ваш ум,
sizeofэто не функция, а директива компилятора*, поэтому ваш код не использует операции при использованииsizeof- это то же самое, что писать номер, только он портативный.использование:
sizeof(long int)* как указал Дэйв в комментариях,
sizeofбудет вычисляться во время выполнения, когда невозможно вычислить значение во время компиляции, например, при использовании массивов переменной длины.также, как указано в другом комментарии,
sizeofпринимает во внимание заполнение и выравнивание, используемые реализацией, что означает, что фактические используемые байты могут отличаться от размера в памяти (это может быть важно при сдвиге битов).если вы ищете конкретные переменные размера байта, рассмотрите возможность использования массива байтов или (я бы предположил, что они поддерживаются) типов, определенных C99 в
stdint.h- как предложил @dbush.
когда мы впервые реализовали C на оборудовании серии ICL 39, Мы взяли стандарт в его слове и сопоставили типы данных с естественным представлением на этой архитектуре машины, которая была
short= 32 бита,int= 64 бит,long= 128 бит.но мы обнаружили, что никакие серьезные приложения C не работали; все они предполагали отображение
short= 16,int= 32,long= 64, и нам пришлось сменить компилятор, чтобы поддержать это.так что независимо от официального стандарт говорит, что в течение многих лет все сходились на
long= 64 бита и это вряд ли изменится.
The стандартный ничего не говорит о размере
long int, так как это зависит от среды, которую вы используете.чтобы получить размер
long intв вашей среде, вы можете использоватьsizeofоператор и получить размерlong int. Что-то вродеsizeof(long int)стандарт C требует только следующих пунктов о размерах типов
- int > = 16 бит,
- long > = 32 бит,
- long long (начиная с C99) > = 64 бит
- оператор sizeof(тип char)
- sizeof (char) == 1
- CHAR_BIT >= 8
остальные реализации определены, поэтому не удивительно, если один столкнулся с некоторыми системами, где int имеет 18/24/36/60 бит, один подписано дополнение форме, оператор sizeof(тип char) == оператор sizeof(короткая) == оператор sizeof(тип int) = = sizeof (long) = = 4, 48-битная длина или 9-битный символ, подобный экзотическим архитектурам, о которых заботятся комитеты по стандартам и список платформы, поддерживаемые стандартом C
пункт о long int выше совершенно неверен. Большинство Linux / Unix реализации определяют long как 64-разрядный тип, но это всего лишь 32 бита Windows, потому что они используют различные модели данных (посмотрите на стол здесь 64-разрядные вычисления), и это независимо от 32 или 64-бит ОС версия.
компилятор определяет размер в зависимости от типа оборудования и операционной системы.
таким образом, предположения не должны быть сделаны относительно размера.
стандарт оставляет его полностью до компилятора, что также означает, что тот же компилятор может сделать его зависимым от параметров и целевой архитектуры.
Так что вы не можете.
кстати
long intЭто то же самое, чтоlong.
короткий ответ: Нет! Вы не можете сделать фиксированные предположения о размере
long int. Потому что стандарт (C standard или POSIX) не документирует размерlong int(Как это неоднократно подчеркивалось). Просто чтобы дать встречный пример вашему убеждению, большинство 64-битных систем имеютlongразмер 64! Для максимальной переносимости используйтеsizeofнадлежащим образом.использовать
sizeof(long int)чтобы проверить размер, он возвращает размерlongв байт. Значение зависит от системы или среды; это означает, что компилятор определяет размер на основе оборудования и ОС.