Возможный дубликат:
Как действуют правила продвижения, когда разница между подписью с обеих сторон бинарного оператора отличается?
Я пытаюсь обернуть голову вокруг цельной рекламы и переполнения на С++. Я немного смущен несколькими пунктами:
a) Если у меня есть следующий сегмент кода:
int i = -15;
unsigned j = 10;
std::cout << i + j;
Я выхожу -5 % UINT_MAX
. Это потому, что выражение i + j
автоматически продвигается без знака? Я пытался прочитать стандарт (4.13):
— The rank of any unsigned integer type shall equal the rank of the corresponding signed integer type.
Я не уверен, что я читаю это неправильно, но если это так, почему i + j
заканчивается как unsigned?
b) Добавляя к предыдущему сегменту, теперь у меня есть:
int k = j + i;
Это получает оценку -5
. Не следует ли сначала оценивать выражение j + i
, предоставляя 4294967291
в моей системе и устанавливая, что оно равно j? Это должно быть за гранью, так это поведение undefined? Я не уверен, почему я получаю -5
.
c) Если я немного изменил сегмент из a), используя short
, у меня есть:
short i = -15;
unsigned short j = 10;
std::cout << i + j;
Я понял, что когда я это сделал, я получаю тот же результат, что и a), только с -5 % USHRT_MAX
. Однако, когда я выполняю это, я получаю -5
. Почему использование short
дает другое значение, чем int
?
d) Я всегда знал, что поведение переполнения подписанного интеграла undefined. Например: int r = ++INT_MAX
будет undefined.
Однако, если было неподписанное переполнение, количество будет определено. Например: unsigned a = ++UINT_MAX
, тогда a будет 0
. Это правильно?
Однако стандарт ничего не сказал об этом. Это правда? Если да, то почему?