Operación de comparación de enteros con y sin signo
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?
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.
#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.
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