Что такое (INT32 MIN + 1), когда int32 t-расширенный целочисленный тип, а int-32-разрядный стандартный целочисленный тип дополнения

представьте себе такую ситуацию. int32_t это расширенный целочисленный тип и он представлен в дополнении two (как стандарт требуется int32_t для представления). Это значит, что INT32_MIN is -2147483648 (0x80000000).

int это стандартный целочисленный тип и он представлен в одном дополнении (как позволяет стандарт). Это значит, что INT_MIN is -2147483647.

теперь поправьте меня, если я ошибаюсь, но я думаю, что оба типа имеют одинаковую ширину, что означает, согласно 6.3.1.1.1 (выделено мной):

ранг любого стандартного целочисленного типа должен быть больше ранга любого расширенного целочисленного типа С той же шириной.

Итак, ранг int32_t меньше, чем int.

теперь 6.3.1.8 (обычные арифметические преобразования) говорит (выделено мной):

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

поэтому, если понять это правильно, в этом блоке кода:

int32_t x = INT32_MIN;
int y = 1;
x + y; // What happens here?

в выражении x + y, x должен быть произведен в int и INT32_MIN находится вне диапазона int.

это ошибка в стандарте или я что-то пропустил?

другими словами, Что значит выражение x + y в этом контексте оцените, как определено стандартом?

2 ответов


int32_t является необязательным. Соответствующая реализация не может иметь 32-битного дополнения int и 32-разрядные два дополняют расширенный целочисленный тип int32_t; если int - это дополнение, int32_t скорее всего не предоставляется.

вот одна из причин 32-битного дополнения int и 32-разрядные два дополняют расширенный целочисленный тип int32_t не могут сосуществовать. Цитируя проект N1570:

7.20.2 пределы заданной ширины целочисленные типы

1 следующие объектно-подобные макросы задают минимальные и максимальные ограничения типов объявлено в <stdint.h>. Каждое имя макроса соответствует аналогичному типу имя в 7.20.1.

2 каждый экземпляр любого определенного макроса должен быть заменен константой выражение, подходящее для использования в директивах # if preprocessing и этот выражение должно иметь тот же тип, что и выражение, которое является объект соответствующего типа преобразуется в соответствии с целым числом акции. Его значение, определяемое реализацией, должно быть равно или больше по величине (абсолютное значение), чем соответствующее значение приведено ниже, с тем же знаком, За исключением случаев, когда указано, что заданное значение.

...

INTN_MIN                                  exactly -(2N-1)

в ситуации, которую вы описываете, INT32_MIN должен иметь значение ровно -2^31, но из-за целой акции, Он должен иметь тип, который не может содержать это значение. Этот противоречие мешает обеспечивать int32_t на всех.


между тем int является стандартным целочисленным типом и представлен в одном дополнит

расширенные целые числа определены реализацией и должны быть только двоичными числами, а целые числа со знаком должны быть представлены в одном дополнении, дополнении двух или обозначении знака и величины

intxx_t-тип int фиксированного размера, он должен иметь то же представление, что и int. Потому что intxx_t два дополнения это требует int, чтобы быть тот же.