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