Я пытаюсь вычесть два unsigned ints и сравнить результат с подписанным int (или литералом). При использовании типов unsigned int
поведение будет таким, как ожидалось. При использовании uint16_t
(от stdint.h
) типы поведения не то, что я ожидал бы. Сравнение проводилось с использованием gcc 4.5.
Учитывая следующий код:C: uint16_t поведение вычитания в gcc
unsigned int a;
unsigned int b;
a = 5;
b = 20;
printf("%u\n", (a-b) < 10);
Выход равен 0, что то, что я ожидал. Оба а и Ь без знака, и б больше, чем, так что результат является крупным беззнаковое число, которое больше 10. Теперь, если я изменить а и б к типу uint16_t:
uint16_t a;
uint16_t b;
a = 5;
b = 20;
printf("%u\n", (a-b) < 10);
Выход 1 . Почему это? Является результатом вычитания двух типов uint16_t, хранящихся в int в gcc? Если я изменю 10
на 10U
, то результат снова будет 0, что, кажется, поддерживает это (если результат вычитания сохраняется как int, а сравнение производится против unsigned int, а результаты вычитания будут преобразованы в unsigned int).
Результат не просто «хранится в int». Все вычитание выполняется как 'int' вычитание, то есть оба операнда uint16_t' преобразуются в' int', прежде чем вычитание даже имеет шанс начать. интегральные рекламные акции. – AnT