Что такое (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, чтобы быть тот же.