"int" действительно требовалось как минимум "короткий" в C?
Я читал пару раз в разных источниках (например, Wikipedia: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size), что в C длинный длинный не меньше длинной, которая не меньше, чем int, которая не меньше короткой.
Однако я рассмотрел это в стандартах C90 и C99 и не нашел соответствующего предложения. Я нашел только, что C90 и C99 определяют минимальные размеры (раздел 5.2.4.2.1 в стандартах C90 и C99), но не их размеры по отношению друг к другу. Я что-то пропустил в стандартах?
Ответы
Ответ 1
6.3.1.1 определяет относительные числа преобразования целочисленного числа любых двух целых типов. Это абстрактная концепция, которая подразумевает только определение взаимосвязи между двумя типами; нет значения, определенного как ранг любого типа.
6.2.5p8 говорит:
Для любых двух целых типов с одинаковой подписью и разными целочисленный ранг преобразования (см. 6.3.1.1), диапазон значений типа с меньшим целым числом ранга преобразования является поддиапазоном значений другой тип.
Он ничего не говорит об их относительных размерах, и на самом деле теоретически возможно, чтобы соответствующая (но преднамеренно извращенная) реализация имела sizeof (short) > sizeof (int)
. Это возможно только в том случае, если short
имеет больше битов дополнения (бит, которые не вносят вклад в значение), чем int
. Это маловероятно; большинство реализаций вообще не имеют битов заполнения, и я не знаю реализаций, где отношения диапазонов целочисленных типов отличаются от отношений их размеров.
Ссылка: либо N1256, последний проект C99, или N1570, последний проект C2011.
Ответ 2
Я предполагаю, что статья Википедии ссылается на диапазон значений этих целых типов, а не на их размер (как сообщается sizeof
).
От C99 стандартный черновик N1256:
6.3.1.1/1
Ранг long long int
должен быть больше ранга long int
, что должно быть больше ранга int
, которое должно быть больше ранга short
int
, которое должно быть больше ранга signed char
.
6.2.5/8
Для любых двух целых типов с одинаковой степенью соответствия и разного целочисленного преобразования (см. 6.3.1.1), диапазон значений типа с меньшим целым числом ранга преобразования равен поддиапазон значений другого типа.
Ответ 3
От C2011 Стандарт
6.3.1.1/1
- ранг long long int должен быть больше ранга long int, который должен быть больше ранга int, который должен быть больше ранга short int, который должен быть больше ранга , подписанного char.