Operación de comparación de enteros con y sin signo

Resuelto Gitmo asked hace 14 años • 7 respuestas

Ver este fragmento de código

int main()
{ 
 unsigned int a = 1000;
 int b = -1;
 if (a>b) printf("A is BIG! %d\n", a-b);
 else printf("a is SMALL! %d\n", a-b); 
 return 0;
}   

Esto da el resultado: a es PEQUEÑO: 1001

No entiendo lo que está pasando aquí. ¿Cómo funciona el operador > aquí? ¿Por qué "a" es más pequeña que "b"? Si de hecho es más pequeño, ¿por qué obtengo un número positivo (1001) como diferencia?

Gitmo avatar Jan 18 '10 16:01 Gitmo
Aceptado

Estás haciendo una comparación sin signo, es decir, comparando 1000 con 2^32 - 1.

La salida está firmada debido a %d en printf.

NB, a veces el comportamiento cuando se mezclan operandos con y sin signo es específico del compilador. Creo que lo mejor es evitarlos y hacer yesos ante la duda.

Antti Huima avatar Jan 18 '2010 09:01 Antti Huima
 #include<stdio.h>
 int main()
 {
   int a = 1000;
   signed int b = -1, c = -2;
   printf("%d",(unsigned int)b);
   printf("%d\n",(unsigned int)c);
   printf("%d\n",(unsigned int)a);

   if(1000>-1){
      printf("\ntrue");
   }
   else 
     printf("\nfalse");
     return 0;
 }

Para ello es necesario comprender la precedencia de los operadores.

  1. Los operadores relacionales funcionan de izquierda a derecha... así que cuando se trata

    si(1000>-1)

luego, primero que nada, cambiará -1 a un entero sin signo porque int se trata de forma predeterminada como un número sin signo y su rango es mayor que el número con signo

-1 cambiará al número sin signo, cambia a un número muy grande

harsh avatar Sep 12 '2018 12:09 harsh