Ao comparar assinado com não assinado, o compilador converte o valor assinado em não assinado. Para igualdade, isso não importa -1 == (unsigned) -1
. Para outras comparações é importante, por exemplo, o seguinte é verdadeiro: -1 > 2U
.
EDIT: Referências:
5/9: (Expressões)
Muitos operadores binários que esperam operandos do tipo aritmético ou enumeração causam conversões e produzem tipos de resultado 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, que são definidas da seguinte maneira:
Se um dos operandos for do tipo long double, o outro deve ser convertido para long double.
Caso contrário, se um dos operandos for duplo, o outro deve ser convertido para duplo.
Caso contrário, se um dos operandos for float, o outro deve ser convertido para float.
Caso contrário, as promoções integrais (4.5) devem ser realizadas em ambos os operandos.54)
Então, se um dos operandos for sem sinal longo, o outro deve ser convertido para sem sinal longo.
Caso contrário, se um operando for um int longo e o outro int não assinado, então se um int longo puder representar todos os valores de um int não assinado, o int não assinado deverá ser convertido em um int longo; caso contrário, ambos os operandos serão convertidos em unsigned long int.
Caso contrário, se um dos operandos for longo, o outro deve ser convertido para longo.
Caso contrário, se um dos operandos não tiver sinal, o outro deve ser convertido para sem sinal.
4.7 / 2: (conversões integrais)
Se o tipo de destino não tiver sinal, o valor resultante será o menor inteiro sem sinal congruente com o inteiro de origem (módulo 2 n onde n é o número de bits usados para representar o tipo sem sinal). [Nota: Em uma representação de complemento de dois, esta conversão é conceitual e não há mudança no padrão de bits (se não houver truncamento). ]
EDIT2: Níveis de alerta MSVC
O que é alertado sobre os diferentes níveis de aviso do MSVC são, obviamente, escolhas feitas pelos desenvolvedores. A meu ver, suas escolhas em relação à igualdade assinado / não assinado vs comparações maiores / menores fazem sentido, isso é totalmente subjetivo, é claro:
-1 == -1
significa o mesmo que -1 == (unsigned) -1
- acho que é um resultado intuitivo.
-1 < 2
não significa o mesmo que -1 < (unsigned) 2
- Isso é menos intuitivo à primeira vista e a IMO merece um aviso "mais cedo".