Como as regras de promoção funcionam quando a assinatura nos dois lados de um operador binário é diferente? [duplicado
Esta pergunta já tem uma resposta aqui:
egras de conversão de tipo implícito em operadores C 9 respostasConsidere os seguintes programas:
// 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;
}
Como o operador + "sabe" qual é o tipo correto para retornar? A regra geral é converter todos os argumentos para o tipo mais amplo, mas aqui não há um "vencedor" claro entreint
eunsigned int
. No primeiro caso,unsigned int
deve ser escolhido como resultado deoperator+
, porque eu obtenho um resultado de2147483648
. No segundo caso, ele deve estar escolhendoint
, porque eu obtenho um resultado de-1
. No entanto, não vejo no caso geral como isso é decidível. Esse comportamento indefinido que estou vendo ou algo mais?