it-swarm.com.ru

Как работают правила продвижения, когда подпись с обеих сторон двоичного оператора различается?

Рассмотрим следующие программы:

// http://ideone.com/4I0dT
#include <limits>
#include <iostream>

int main()
{
    int max = std::numeric_limits<int>::max();
    unsigned int one = 1;
    unsigned int result = max + one;
    std::cout << result;
}

а также

// http://ideone.com/UBuFZ
#include <limits>
#include <iostream>

int main()
{
    unsigned int us = 42;
    int neg = -43;
    int result = us + neg;
    std::cout << result;
}

Как оператор + "узнает", какой тип возвращать? Общее правило заключается в преобразовании всех аргументов в самый широкий тип, но здесь нет явного "победителя" между int и unsigned int. В первом случае unsigned int должен быть выбран как результат operator+, потому что я получаю результат 2147483648. Во втором случае необходимо выбрать int, потому что я получаю результат -1. Тем не менее, я не вижу в общем случае, как это разрешимо. Это неопределенное поведение, которое я вижу, или что-то еще?

24
Billy ONeal

Он выбирает тип, в который вы помещаете свой результат, или, по крайней мере, cout учитывает этот тип во время вывода.

Я не помню точно, но я думаю, что компиляторы C++ генерируют один и тот же арифметический код для обоих, это только сравнение и вывод, которые заботятся о знаке.

2
Andrew White