unsigned int
эквивалентно uint32_t
и unsigned short int
эквивалентно uint16_t
.
Следовательно, если вы используете unsigned short int
вместо unsigned int
, вы получите то же поведение, что и для uint16_t
.
Почему вы получаете -1?
Интегральное продвижение попытается преобразовать unsigned short int
в int
, если int
может вместить все возможные значения unsigned short int
. С другой стороны, если это не так, будет выполнено интегральное повышение до unsigned int
.
Поэтому вычитание, скорее всего, выполняется в виде int
, а не uint16_t
.