C: comportamento de subtração uint16_t no gcc
Eu estou tentando subtrair dois ints não assinados e comparar o resultado para um int assinado (ou um literal). Ao usarunsigned int
tipos o comportamento é como esperado. Ao usaruint16_t
(porstdint.h
) tipos o comportamento não é o que eu esperaria. A comparação foi feita usando o gcc 4.5.
Dado o seguinte código:
<code>unsigned int a; unsigned int b; a = 5; b = 20; printf("%u\n", (a-b) < 10); </code>
A saída é 0, que é o que eu esperava. Tanto a como b são sem sinal, e b é maior que a, portanto, o resultado é um grande número não assinado maior que 10. Agora, se eu alterar a e b, digite uint16_t:
<code>uint16_t a; uint16_t b; a = 5; b = 20; printf("%u\n", (a-b) < 10); </code>
A saída é 1. Por que isso acontece? O resultado da subtração é entre dois tipos uint16_t armazenados em um int no gcc? Se eu mudar o10
para10U
a saída é novamente 0, o que parece suportar isso (se o resultado da subtração é armazenado como um int e a comparação é feita contra um int não assinado que os resultados da subtração serão convertidos em um int não assinado).