Добавление выполняется с исходными значениями и является правильным.
unsigned short x = a + b;
Тем не менее, отображение выполняется с преобразованными значениями.
printf("init:%hu %hu = %hu\n", (unsigned char)a, (unsigned char)b, ....
Распечатайте char
исходные значения.
#if CHAR_MAX <= INT_MAX
printf("a:%d b:%d\n", a, b);
#else
// this is rare
printf("a:%u b:%u\n", a, b);
#endif
OP увидит, что первое добавление - init:-26 100 = 74
, а сумма 74 соответствует ожидаемой.
При init:200 200 = 65424
исходные значения char
равны -56. -56 + -56 это -112. Присвоение -112 16-битному unsigned short
(0-65535) добавляет 65536, а затем присваивает. -112 + 65536
-> 65424
.