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).

questionAnswers(2)

yourAnswerToTheQuestion