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:
unsigned int a;
unsigned int b;
a = 5;
b = 20;
printf("%u\n", (a-b) < 10);
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:
uint16_t a;
uint16_t b;
a = 5;
b = 20;
printf("%u\n", (a-b) < 10);
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).