C: zachowanie odejmowania uint16_t w gcc

Usiłuję odjąć dwa niepodpisane ints i porównać wynik do podpisanego int (lub literału). Podczas używaniaunsigned int typy zachowanie jest zgodne z oczekiwaniami. Podczas używaniauint16_t (zstdint.h) typy zachowanie nie jest tym, czego bym się spodziewał. Porównanie zostało wykonane przy użyciu gcc 4.5.
Podany następujący kod:

<code>unsigned int a;
unsigned int b;

a = 5;
b = 20;

printf("%u\n", (a-b) < 10);
</code>

Wyjście to 0, czego się spodziewałem. Zarówno a, jak i b są niepodpisane, a b jest większe niż a, więc wynikiem jest duża liczba bez znaku, która jest większa niż 10. Teraz, jeśli zmienię a i b, aby wpisać uint16_t:

<code>uint16_t a;
uint16_t b;

a = 5;
b = 20;

printf("%u\n", (a-b) < 10);
</code>

Wyjście to 1. Dlaczego tak jest? Czy wynik odejmowania między dwoma typami uint16_t przechowywanymi w int w gcc? Jeśli zmienię10 do10U wyjście jest ponownie 0, co wydaje się obsługiwać to (jeśli wynik odejmowania jest przechowywany jako int, a porównanie jest dokonywane z intencją unsigned, wyniki odejmowania będą konwertowane na int unsigned).

questionAnswers(2)

yourAnswerToTheQuestion