Спасибо, это дало мне больше ясности

пост предназначен для использования в качестве часто задаваемых вопросов, касающихся неявного целочисленного продвижения в C, особенно неявного продвижения, вызванного обычными арифметическими преобразованиями и / или целочисленными продвижениями.

Пример 1)
Почему это дает странное, большое целое число, а не 255?

unsigned char x = 0;
unsigned char y = 1;
printf("%u\n", x - y); 

Пример 2)
Почему это дает «-1 больше 0»?

unsigned int a = 1;
signed int b = -2;
if(a + b > 0)
  puts("-1 is larger than 0");

Пример 3)
Почему изменение типа в приведенном выше примере наshort решить проблему?

unsigned short a = 1;
signed short b = -2;
if(a + b > 0)
  puts("-1 is larger than 0"); // will not print

(Эти примеры были предназначены для 32- или 64-разрядного компьютера с 16-разрядным сокращением.)