По моему чтению стандарта С++ я всегда понимал, что размеры интегральных фундаментальных типов в С++ были следующими:
sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Я вывел это из 3.9.1/2:
- Существует четыре знаковых целочисленных типа: "подписанный char", "короткий int", "int" и "long int". В этом списке, каждый тип обеспечивает как минимум столько же хранения, как предшествующие ему в список. Обычные размеры имеют натуральный размер предложенной архитектурой среда выполнения
Кроме того, размер char
описывается в 3.9.1/как:
- [...] достаточно большой для хранения любого элемента базового набора символов реализации.
1.7/1 определяет это более конкретно:
- Основным блоком памяти в модели памяти C + + является байт. Байт, по меньшей мере, достаточно большой, чтобы содержать любой элемент базового набора символов исполнения и состоит из непрерывной последовательности бит, число которых определяется реализацией.
Это приводит меня к следующему выводу:
1 == sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
где sizeof
указывает, сколько байтов является типом. Кроме того, определено, сколько бит находится в байте. Большинство из нас, вероятно, используются для работы с 8-битными байтами, но в стандарте говорится, что в байте есть n
бит.
В этом сообщении Альф П. Штейнбах говорит:
long гарантируется (минимум) 32 бита.
Это бросается в глаза всему, что я понимаю, размер фундаментальных типов должен быть на С++ в соответствии со стандартом. Обычно я просто отказываюсь от этого утверждения, поскольку новичок ошибается, но поскольку это был Альф, я решил, что стоит исследовать дальше.
Итак, что вы говорите? Является ли долго гарантированным стандартом быть как минимум 32 бита? Если да, будьте конкретны в отношении того, как делается эта гарантия. Я просто этого не вижу.
-
Стандарт С++ специально говорит, что для того, чтобы знать С++, вы должны знать C (1.2/1) 1
-
Стандарт С++ неявно определяет минимальный предел для значений a
long
может вместитьLONG_MIN
-LONG_MAX
2
Итак, независимо от того, насколько велик a long
, он должен быть достаточно большим, чтобы удерживать LONG_MIN до LONG_MAX.
Но Alf и другие специфичны, что длина должна быть не менее 32 бит. Это то, что я пытаюсь установить. Стандарт С++ является явным, что количество битов в байте не указано (это может быть 4, 8, 16, 42). Каким образом соединение связано с возможностью размещения чисел LONG_MIN-LONG_MAX
как минимум 32 бита
(1) 1.2/1: Следующие ссылочные документы являются обязательными для применения этого документа. Для датированных ссылок применяется только указанное издание. Для недатированных ссылок применяется последнее издание ссылочного документа (включая любые поправки).
- ISO/IEC 2382 (все части), Информационные технологии - Словарь
- ISO/IEC 9899: 1999, Языки программирования - C
- ISO/IEC 10646-1: 2000, Информационные технологии. Универсальный многоточечный кодированный набор символов (UCS). Часть 1. Архитектура и базовая многоязычная плоскость.
(2) Определено в <climits>
как:
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1