3-байтовый int и 5-байтовый длинный?

Соответствует ли каждый из стандартов C и С++ sizeof числовых типов не равным двум?

Известны следующие ограничения:

  • 16 <= CHAR_BIT * sizeof(int) <= CHAR_BIT * sizeof(long)
  • 32 <= CHAR_BIT * sizeof(long) <= CHAR_BIT * sizeof(long long)
  • и еще десяток других, которые по типичной 8-битовой архитектуре байта означают 2 <= sizeof(int) && 4 <= sizeof(long)

Означает ли это, что sizeof(int) == 3 && sizeof(long) == 5 является допустимым поведением?

Если да - существует ли какой-либо известный компилятор/архитектура, работающая аналогичным образом?

Ответ 1

Я думаю, что 3.9.1/2 (С++ 98) прекрасно понимает это (сразу после него следует аналогичная информация для неподписанных типов):

Существует четыре знаковых целочисленных типа: "подписанный char", "короткий int", "int" и "long int". В этом списке каждый тип обеспечивает как минимум большое количество хранилищ, чем предшествующие ему в списке. Обычные ints имеют естественный размер, предложенный архитектурой исполнения environment39); другие подписанные целочисленные типы предоставляются для удовлетворения особые потребности.

В основном все, что мы знаем, это sizeof(char) == 1 и что каждый "более крупный" тип, по крайней мере, такой большой, причем int является "естественным" размером для архитектуры (где, насколько я могу сказать "естественный", до компилятора). Мы не знаем ничего подобного CHAR_BIT * sizeof(int) <= 32 и т.д. Также имейте в виду, что CHAR_BIT тоже не должно быть 8.

Кажется довольно безопасным сказать, что три байта int и пять байт long будут разрешены для аппаратного обеспечения, где эти размеры были изначально использованы. Однако я не знаю никаких таких аппаратных средств/архитектур.

EDIT: Как указано в комментарии @Nigel Harper, мы знаем, что int должно быть не менее 16 бит и long не менее 32 бит для удовлетворения требований диапазона. В противном случае у нас нет каких-либо ограничений по размеру, кроме как показано выше.

Ответ 2

TL; DR

Поведение действительно и такие компиляторы/архитектуры существуют

  • TI DSP с 4-байтным int, 5-байтовым long
  • Серия Motorola DSP5600x/3xx с 2 байтами short, 3-байтовый int, 6-байтовый long
  • x86 с 8-байтовым double, 10-байтным long double

Число битов, используемых для представления типа long, не всегда совпадает с числом битов типа int или целочисленным числом. Может потребоваться возможность представления большего диапазона значений (чем это возможно в типе int), но затраты на процессор также могут быть рассмотрены

Дерек М. Джонс" Новый стандарт С (изложенный материал) - экономический и культурный комментарий


В другом ответе уже указаны стандартные требования к С++. Аналогично, C-стандарт также не ограничивает размеры типа (с плавающей запятой или целое) в байтах с полномочиями 2. Наиболее распространенным примером является long double, который чаще всего составляет 10 байтов в x86 (с отступом до 12 или 16 байт во многих современных компиляторах).

ISO/IEC 9899: 1999 (E)

5.2.4.2.1 Размеры целых типов

  • Значения, приведенные ниже, должны быть заменены постоянными выражениями, подходящими для использования в директивах #if предварительной обработки. Кроме того, кроме CHAR_BIT и MB_LEN_MAX, заменяются выражения, которые имеют тот же тип, что и выражение, являющееся объектом соответствующего типа, преобразованного в соответствии с целыми рекламными акциями. Их значения, определяемые реализацией, должны быть равны или больше по величине (по абсолютной величине) тем, которые показаны, с тем же знаком. [...]

6.2.5 Типы

  1. Существует пять стандартных стандартных целочисленных типов, обозначенных как signed char, short int, int, long int и long long int. (Эти и другие типы могут быть назначены несколькими дополнительными способами, как описано в 6.7.2.) Могут также быть определенные с расширенной поддержкой расширенные типы со знаком целого типа. 28)
    Стандартные и расширенные целые типы со знаком со знаком называются целыми типами со знаком. 29)

  2. Для любых двух целочисленных типов с одинаковой степенью соответствия и разного целочисленного преобразования (см. 6.3.1.1) диапазон значений типа с меньшим числом ранга преобразования является поддиапазоном значений другой тип.

Нечетные целочисленные типы намного реже, но все еще существуют. Многие DSP имеют совместимые со стандартом компиляторы с не-power-or-2 типа, где int имеет 32 бита, long имеет 40 бит.

  • long
    • 40 бит или 5 байтов для C6000 COFF. Это полностью совместимо с любым основным стандартом C/С++, поскольку все эти стандарты определяют минимальное требование длиной 4 байта (ака. long int). Программисты часто ошибочно предполагают, что этот тип имеет размер ровно 4 байта.
    • 32 бит или 4 байта для C6000 EABI/ELF. См. Страницу миграции C6000 EABI для обсуждения воздействия при портировании кода, который был закодирован с 40-битным временем, но видит только 32-разрядную целевую платформу миграции.

Акцент на
Поддержка C89 в компиляторах TI # Непонимание о TI C

Примечание к офсайту: на некоторых объектах даже long long также является 32 или 40-битным типом, который действителен в C89 как расширение, но нарушает C99

Некоторые цели имеют long long (расширение от C99), но не соответствующее. C99 требует не менее 64 бит, но C2700 имеет 32-разрядный long long, а C5500 - 40 бит long long. C2800, C6000 и ARM имеют 64-разрядный long long, а C5400 и MSP430 не поддерживают long long. Это не является технически нарушением C89, поскольку на самом деле это расширение, но если мы начнем поддерживать C99, это будет нарушением C99 (C99 5.2.4.2.1 "Размеры целочисленных типов", пункт 1).

Более широкий размер шрифта даже не должен быть кратным его предыдущему размеру типа

Число битов, используемых для представления типа long, не всегда совпадает с числом битов типа int или целочисленным числом. Может потребоваться возможность представления большего диапазона значений (чем возможно в типе int), но затраты на процессор также могут быть рассмотрены. Например, Texas Instruments TMS320C6000, процессор DSP, использует 32 бита для представления типа int и 40 бит для представления типа long (этот выбор не является редкостью). Эти процессоры (обычно DSP), которые используют 24 бита для представления типа int, часто используют 48 бит для представления типа long. Использование представлений целочисленного типа 24/48 бит может быть обусловлено требованиями приложений, когда представление типа 32/64-битного целочисленного типа не является экономически эффективным.

Дерек М. Джонс" Новый стандарт С (выдержки из материала): экономический и культурный комментарий

Во всех 24-разрядных ЦСП, которые я знал раньше, CHAR_BIT == 24, и все типы имеют размеры как кратность 24 бит, но я только что узнал, что Motorola DSP5600x/3xx series имеет действительно "странную" систему типов

Data Type           size in bits
(un)signed char     8
(un)signed short    16
(un)signed int      24
(un)signed long     48
(long)_fract        24 (48)
pointer             16/24
float/double        24+8
enum                24

Итак, в этом случае sizeof(char) == 1 && sizeof(short) == 2, но sizeof(int) == 3 и sizeof(long) == 6

К сожалению, GCC называет его (long или long long) целые числа двойного слова, и так делают большинство людей, делая большой недоразумение, хотя оно не обязательно должно быть в два раза больше.

Ответ 3

Стандарт С++ (и почти наверняка стандарт C, но я не смотрел на него в течение очень долгого времени) не имеет правила, в котором говорится о NUMBER бит, который должен быть типом. Я знаю, что разрешен 9-разрядный char, и есть машины с 36-битными целыми числами. В прошлый раз, когда я проверил, ни 9, ни 36 не являются степенями 2.

Ответ 4

Определенно существуют платформы с 24-битными ints. Это все еще используется для некоторых встроенных приложений. Вы можете проверить Википедию для получения дополнительной информации: http://en.wikipedia.org/wiki/24-bit