¿Por qué GCC advierte solo para las situaciones 1 y 3 y no 2 en el siguiente código?GCC no advierte cuando se usa == op con una var firmada y un literal sin firmar
Estoy compilando con banderas de -Wall y -g.
int main() {
unsigned int ui = 4;
int si = 6;
if (si == ui) { // Warning comparison b/w signed and unsigned
printf("xxxx");
}
if (si == 2U) { // No Warning --- WHY ???
printf("xxxx");
}
if (si > 2U) { // Warning comparison b/w signed and unsigned
printf("xxxx");
}
return 0;
}
Es de hecho ' promocionado 'a unsigned, pero no hay diferencia cuando su valor es menor que 2^31 - 1. –
@ryanli: si siempre se promociona a unsigned, entonces si == 2U también debería lanzar una advertencia. ¿Por qué es 2147483647 el punto mágico donde, con solo la bandera de la pared, debería comenzar a lanzar una advertencia? Supongo que no entiendo tu respuesta inicial. – nisah
porque '2U' es un literal, y aunque' si' está 'signed', gcc sabe claramente en tiempo de compilación que' si' se puede comparar con el valor de '2U' sin perder precisión: si' si' es negativo en sí mismo , no es igual a '2U' después de promocionado a unsigned. Pero para valores literales mayores que 2^31-1, gcc lanza una advertencia ya que 'si' podría ser igual al literal si' si' es negativo, lo que puede no ser el resultado esperado. Y '-Wall' no advierte nada, como lo muestra el enlace en mi respuesta. –