Para uma resposta mais detalhada. Veja o que diz a seção §5 / 9 do padrão C ++
Muitos operadores binários que esperam operandos do tipo aritmético ou de enumeração causam conversões e geram tipos de resultados de maneira semelhante. O objetivo é produzir um tipo comum,
que também é o tipo do resultado .
Esse padrão é chamado de conversões aritméticas usuais, definidas da seguinte forma:
- Se um operando for do tipo long double, o outro será convertido em long double.
- Caso contrário, se um dos operandos for duplo, o outro será convertido para o dobro.
- Caso contrário, se um operando for flutuante, o outro será convertido em flutuante.
- Caso contrário, as promoções integrais (4.5) serão realizadas nos dois operandos.54)
- Então, se um dos operandos não tiver assinado por muito tempo, o outro será convertido em não assinado por muito tempo.
- Caso contrário, se um operando for um int longo e outro int não assinado, se um int longo puder representar todos os valores de um int não assinado, o int não assinado será convertido em um int longo; caso contrário, ambos os operandos serão convertidos em int longo não assinado.
- Caso contrário, se um operando for longo, o outro será convertido em longo.
- Caso contrário, se um dos operandos não estiver assinado, o outro será convertido em não assinado.
[Nota: caso contrário, o único caso restante é que ambos os operandos sejam int]
^
é XOR.