Reglas de promoción de tipo implícito

Esta publicación está destinada a ser utilizada como una pregunta frecuente con respecto a la promoción de enteros implícitos en C, particularmente la promoción implícita causada por las conversiones aritméticas habituales y / o las promociones de enteros.

Ejemplo 1)
¿Por qué esto da un número entero grande y extraño y no 255?

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

Ejemplo 2)
¿Por qué esto da "-1 es mayor que 0"?

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

Ejemplo 3)
¿Por qué cambiar el tipo en el ejemplo anterior ashort ¿arreglar el problema?

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

(Estos ejemplos estaban destinados a una computadora de 32 o 64 bits con 16 bits cortos).

Respuestas a la pregunta(2)

Su respuesta a la pregunta