2011-09-22 17 views
8

Tengo el siguiente código:comportamiento advertencia extraño con gcc y firmados/comparaciones sin firmar

unsigned int a; 
if (a > numeric_limits<int>::max()) 
    do_stuff(); 

Al compilar, gcc se queja de

advertencia: "la comparación entre el signo y sin signo"

OK, entiendo

Pero, con el siguiente código:

unsigned int a; 
if (a > (numeric_limits<int>::max())) 
    do_stuff(); 

La advertencia ya no se muestra y realmente no sé por qué ... ¿Hay alguna razón lógica para tal comportamiento o estoy haciendo algo mal ?!

+1

Intentó [simular este comportamiento] (http: // www. ideone.com/5NZL9). Pero muestra advertencia. – iammilind

+0

¿Cuál es el código que lo rodea? – quasiverse

+0

La parte do_stuff() solo consiste en lanzar una excepción. No hay un código que lo rodee ya que son las únicas líneas dentro de una función. Sin embargo, la función se usa en un proyecto grande. Probé el código proporcionado por iammilind pero la advertencia no aparece. Estas son las opciones de gcc que utilizo para compilar el programa '-Wall -ansi -pedantic -Wno-long-long' – malamioute

Respuesta

-1

La respuesta está en la forma en que gcc maneja int y unsigned int.

y int almacenan un valor de 2 bytes. La diferencia entre ellos es que unsigned int no admite valores negativos. Solo puede almacenar valores de 0-65,535. Cuando GCC ve una comparación entre int y unsigned int, convierte el int en un número positivo. Por ejemplo, si el valor de int es -2, lo convertirá en 2. Pero si el int está precedido por el operador(). (En t). GCC lo interpreta como un número positivo (pero aún lo convierte) y no da una advertencia.

+0

'int' no es un" valor de 2 bytes "en general, y no en prácticamente ningún compilador de C++ actualmente utilizado. –

0

no tienen actualmente acceso a un compilador de C++ para probar esto, pero creo que esto podría funcionar sin ningún tipo de advertencias:

unsigned int a; 
if (a > numeric_limits<unsigned int>::max()) 
    do_stuff(); 
+0

¡Esto definitivamente debería producir una advertencia (declaración siempre falsa)! – UncleBens

+0

Para obtener el mismo resultado sin una advertencia, tomaría 'if (a> unsigned (numeric_limits :: max()))'. – UncleBens

+0

Lo veo ahora también. 'a' no puede ser mayor que' 0xffffffff', por lo que 'if (a> unsigned (numeric_limits :: max()))' es correcto, como se indica en @UncleBens. – npclaudiu