unsigned u = 1;
int i = -u;
Подходит ли 2-е присвоение к 6.5.5: если во время вычисления выражения возникает исключительное условие (то есть, если результат не определен математически или не находится в диапазоне представимых значений для его типа ), поведение undefined .
Или подпадает под 6.3.1.3:
1 Когда значение с целочисленным типом преобразуется в другой целочисленный тип, отличный от _Bool, ...
...
3 В противном случае новый тип подписывается, и значение не может быть представлено в нем ; либо
результат определяется реализацией или определяется сигнал реализации.
Я написал этот вопрос, потому что следующее (спасибо R .. за разъяснения) генерирует неопределенное поведение в 6.5.5:
int i = INT_MIN;
i = -i;
Проблема с вышесказанным заключается в том, что выражение -i
имеет тип int
, а -INT_MIN
для платформы дополнения 2 может быть больше, чем INT_MAX. В этом контексте он генерирует неопределенное поведение.
С другой стороны, для:
unsigned u = 1;
int i = -u;
-u
относится к типу без знака. Как объяснено в Определено ли поведение вычитания целого числа без знака? , хотя диапазон без знака номинально находится в диапазоне от 0 до UINT_MAX
, на самом деле не существует такого понятия, как значение без знака вне диапазона. Так что 6.5.5 не распространяется на -u
. Но у нас все еще есть выражение присваивания i=-u
, в этом случае применяется 6.3.1.3.
Или, иначе говоря, если я могу перефразировать 6.5.5, это будет:
Если во время вычисления выражения возникает исключительное условие (то есть, если результат не определен математически или не находится в диапазоне представимых значений для его типа), , если тип выражения не является стандартным или расширенным тип без знака , поведение не определено. Если тип выражения является одним из стандартного или расширенного типа без знака, и результат меньше 0 или превышает максимальное представимое значение, результат должен быть скорректирован в соответствии с 6.3.1.3/2.