Как проверить, содержит ли переменная int допустимое значение (не представление прерываний)? - PullRequest
6 голосов
/ 07 января 2020

Контекст:

Это в основном продолжение , что другой вопрос . OP хотел угадать, содержит ли переменная int или нет, и я сначала подумал, что в C (как в C ++) переменная int может содержать только значение int. И Eri c Postpischil напомнил мне, что представления ловушек были разрешены для стандарта для типа int ...

Конечно, я знаю, что в большинстве современных систем используются только представления с 2 дополнениями целые числа и никакие биты заполнения, означающие, что представление ловушки не может наблюдаться. Тем не менее оба стандарта, по-видимому, по-прежнему допускают 3 представления типов со знаком: знак и величина, одно дополнение и два дополнения. И, по крайней мере, черновик C18 (n2310 6.2.6 Представления типов) явно позволяет заполнять биты для целочисленных типов, отличных от char.

Вопрос

Таким образом, в контексте возможных битов заполнения или не двоичных чисел дополнить представление со знаком, переменные int могут содержать значения ловушек для соответствующих реализаций. Есть ли надежный способ убедиться, что переменная int содержит допустимое значение?

1 Ответ

5 голосов
/ 07 января 2020

В текущем рабочем проекте C ++ (для C ++ 20) целое число не может иметь представление прерывания. Целое число является обязательным дополнением к двум: ([basi c .fundamental] / 3)

Целочисленный тип без знака имеет то же представление объекта, представление значения и требования выравнивания ([basi * 1023) * .align]) как соответствующий целочисленный тип со знаком. Для каждого значения x целочисленного типа со знаком значение соответствующего целочисленного типа без знака, равное x по модулю 2N, имеет такое же значение соответствующих битов в своем представлении значения. 41 [Пример: значение -1 целочисленного типа со знаком имеет такое же представление, что и наибольшее значение соответствующего типа без знака. - конец примера]

Где примечание 41 говорит:

Это также называется представлением дополнения до двух.

Это было изменено в p0907 .

Кроме того, биты заполнения в целых числах не могут вызывать прерывания: ([basi c .fundamental / 4])

Каждый набор значений для любого биты заполнения ([basi c .types]) в представлении объекта являются альтернативными представлениями значения, указанного представлением значения. [Примечание: биты заполнения имеют неопределенное значение, но не вызывают прерывания. См. Также ISO C 6.2.6.2. - конец примечания]

...