Могу ли я предположить, что размер long int всегда составляет 4 байта?
это всегда правда, что long int
(который насколько я понимаю является синонимом long
) составляет 4
байт?
могу ли я на это положиться? Если нет, Может ли это быть верно для ОС на основе POSIX?
9 ответов:
стандарты ничего не говорят о точном размере любых целочисленных типов, кроме
char
. Как правило,long
32-бит на 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_BIT
8, это дает минимальный размер байта 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
в байт. Значение зависит от системы или среды; это означает, что компилятор определяет размер на основе оборудования и ОС.