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