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