унарный - оператор: реализация определена или не определена - PullRequest
1 голос
/ 02 ноября 2011
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.

1 Ответ

3 голосов
/ 02 ноября 2011

Подпадает под 6.3.1.3. В выражении -u нет ничего исключительного. Это равно UINT_MAX. Присвоение результата типу со знаком, в котором значение UINT_MAX не может быть представлено, приводит к преобразованию или сигналу, определяемому реализацией.

...