Какой раздел в стандарте C ++ 11 диктует относительное упорядочение между размерами примитивных типов данных? - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь найти, определяет ли стандарт C ++ отношения между размерами различных типов.Например, этот ответ на https://stackoverflow.com/a/589599/1175080 кажется утверждением:

sizeof(short int) <= sizeof(int) <= sizeof(long int)

Другой ответ на https://stackoverflow.com/a/589684/1175080 имеет аналогичное утверждение:

sizeof(int) <= sizeof(long)

Я идудо n3337.pdf (я считаю, что хороший прокси для стандарта C + 11), но я не могу найти конкретный язык, который гарантирует эти неравенства.

В n1256 (C99), я могу найти конкретный язык в разделе 5.2.4.2.1 Размеры целочисленных типов , в котором четко прописаны минимальные и максимальные значения для каждого типа, что косвенно устанавливает относительный порядок между размерами.

Являются ли эти неравенства сходным образом определенными в стандарте C ++ или они прямо унаследованы от C?Где язык для этого в стандарте?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

В n3337, раздел: 3.9.1 , [basic.fundamental] / 2 , второй абзац (выделено мной):

Существует пять стандартных типов целых чисел со знаком: «знаковый символ», «короткий int», «int», «long int» и «long long int».В этом списке каждый тип обеспечивает как минимум столько же памяти, сколько предшествует ему в списке .Могут также существовать расширенные целочисленные типы со знаком.Стандартные и расширенные целочисленные типы со знаком вместе называются целочисленными типами со знаком.Простые целые имеют естественный размер, предложенный архитектурой среды исполнения44;другие целочисленные типы со знаком предоставляются для удовлетворения особых потребностей.


Обратите внимание, что 5.2.4.2 / 1 в стандарте C определяет только минимальный диапазон для каждого целочисленного типа, это не обеспечивает порядок - я мог бы иметь int с -32767 до 32767 и short с -2147483647 до 2147483647 и все еще соответствовать этому разделу.

Однако 6.2.5.8 гораздо более явный:

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

И 6.3.1.1 говорит вам, что:

Ранг long long int должен бытьбольше, чем ранг long int, который должен быть больше, чем ранг int, который должен быть больше, чем ранг short int, который должен быть больше, чем ранг подписанного символа.

0 голосов
/ 24 мая 2018

Из раздела 3.9.1, абзац 2:

Существует пять стандартных целочисленных типов со знаком: «знаковое число», «короткое целое», «int», «длинное целое» и «long long int ».В этом списке каждый тип обеспечивает как минимум столько же памяти, сколько предшествует ему в списке.Могут также существовать расширенные целочисленные типы со знаком.Стандартные и расширенные целочисленные типы со знаком вместе называются целочисленными типами со знаком.Простые целые имеют естественный размер, предложенный архитектурой среды исполнения 44;другие целочисленные типы со знаком предоставляются для удовлетворения особых потребностей.

Также полезно знать о двух основных 64-битных вариантах: LP64 и LLP64 .По сути, все ОС Unix (включая MacOS / OSX) являются LP64, а Windows - LLP64.Но это, конечно, не является частью стандартов C или C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...