Как работают правила повышения, если подписи с обеих сторон двоичного оператора различаются? [дубликат]

На этот вопрос уже есть ответ здесь:

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

// http://ideone.com/4I0dT
#include 
#include 

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

и

// http://ideone.com/UBuFZ
#include 
#include 

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 . Однако в общем случае я не понимаю, как это разрешимо. Я вижу это неопределенное поведение или что-то еще?

25
задан Wolf 17 December 2014 в 10:51
поделиться