Могу ли я предположить, что размер long int всегда составляет 4 байта?


это всегда правда, что long int (который насколько я понимаю является синонимом long) составляет 4 байт?

могу ли я на это положиться? Если нет, Может ли это быть верно для ОС на основе POSIX?

9 67

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, a long 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-bit
  • int64_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-бит ОС версия.

источник

компилятор определяет размер в зависимости от типа оборудования и операционной системы.

таким образом, предположения не должны быть сделаны относительно размера.

С блог Usrmisc:

стандарт оставляет его полностью до компилятора, что также означает, что тот же компилятор может сделать его зависимым от параметров и целевой архитектуры.

Так что вы не можете.

кстати long int Это то же самое, что long.

короткий ответ: Нет! Вы не можете сделать фиксированные предположения о размере long int. Потому что стандарт (C standard или POSIX) не документирует размер long int (Как это неоднократно подчеркивалось). Просто чтобы дать встречный пример вашему убеждению, большинство 64-битных систем имеют long размер 64! Для максимальной переносимости используйте sizeof надлежащим образом.

использовать sizeof(long int) чтобы проверить размер, он возвращает размер long в байт. Значение зависит от системы или среды; это означает, что компилятор определяет размер на основе оборудования и ОС.