Al comparar firmado con no firmado, el compilador convierte el valor firmado en no firmado. Para la igualdad, esto no importa -1 == (unsigned) -1
. Para otras comparaciones que importe, por ejemplo, lo siguiente es cierto: -1 > 2U
.
EDITAR: Referencias:
5/9: (Expresiones)
Muchos operadores binarios que esperan operandos de tipo aritmético o enumeración provocan conversiones y producen tipos de resultados de manera similar. El propósito es producir un tipo común, que también es el tipo de resultado. Este patrón se denomina conversiones aritméticas habituales, que se definen de la siguiente manera:
Si alguno de los operandos es de tipo long double, el otro se convertirá en long double.
De lo contrario, si alguno de los operandos es doble, el otro se convertirá en doble.
De lo contrario, si alguno de los operandos es flotante, el otro se convertirá en flotante.
De lo contrario, las promociones integrales (4.5) se realizarán en ambos operandos. 54)
Entonces, si alguno de los operandos tiene un signo largo, el otro se convertirá en un operador largo sin signo.
De lo contrario, si un operando es un int largo y el otro int sin signo, entonces si un int largo puede representar todos los valores de un int sin signo, el int sin signo se convertirá en un int largo; de lo contrario, ambos operandos se convertirán a unsigned long int.
De lo contrario, si alguno de los operandos es largo, el otro se convertirá en largo.
De lo contrario, si alguno de los operandos está sin firmar, el otro se convertirá a unsigned.
4.7 / 2: (Conversiones integrales)
Si el tipo de destino no tiene signo, el valor resultante es el menor entero sin signo congruente con el entero de origen (módulo 2 n donde n es el número de bits utilizados para representar el tipo sin signo). [Nota: En una representación en complemento a dos, esta conversión es conceptual y no hay cambios en el patrón de bits (si no hay truncamiento). ]
EDIT2: niveles de advertencia de MSVC
Lo que se advierte sobre los diferentes niveles de advertencia de MSVC son, por supuesto, las decisiones tomadas por los desarrolladores. Como lo veo, sus elecciones en relación con la igualdad firmado / no firmado frente a comparaciones mayores / menores tienen sentido, esto es completamente subjetivo, por supuesto:
-1 == -1
significa lo mismo que -1 == (unsigned) -1
- Encuentro que es un resultado intuitivo.
-1 < 2
no significa lo mismo que -1 < (unsigned) 2
- Esto es menos intuitivo a primera vista, y la OMI merece una advertencia "antes".