C: uint16_t comportamiento de resta en gcc
Estoy tratando de restar dos entradas sin firmar y comparar el resultado con un int firmado (o un literal). Cuando usasunsigned int
Los tipos de comportamiento son los esperados. Cuando usasuint16_t
(desdestdint.h
) escribe el comportamiento no es lo que yo esperaría. La comparación se realizó utilizando gcc 4.5.
Dado el siguiente código:
unsigned int a;
unsigned int b;
a = 5;
b = 20;
printf("%u\n", (a-b) < 10);
La salida es 0, que es lo que esperaba. Tanto a como b están sin signo, y b es más grande que a, por lo que el resultado es un gran número sin signo que es mayor que 10. Ahora, si cambio a y b para escribir uint16_t:
uint16_t a;
uint16_t b;
a = 5;
b = 20;
printf("%u\n", (a-b) < 10);
La salida es 1. ¿Por qué es esto? ¿El resultado de la resta entre dos tipos uint16_t se almacena en un int en gcc? Si cambio el10
a10U
la salida es nuevamente 0, lo que parece ser compatible con esto (si el resultado de la resta se almacena como un int y la comparación se hace con un int sin signo, los resultados de la resta se convertirán en un int sin signo).