Regras implícitas de promoção de tipo

Esta postagem deve ser usada como uma FAQ sobre promoção de número inteiro implícito em C, especialmente promoção implícita causada pelas conversões aritméticas comuns e / ou promoções de número inteiro.

Exemplo 1)
Por que isso fornece um número inteiro grande e estranho e não 255?

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

Exemplo 2)
Por que isso dá "-1 é maior que 0"?

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

Exemplo 3)
Por que alterar o tipo no exemplo acima parashort corrigir o problema?

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

(Esses exemplos foram projetados para um computador de 32 ou 64 bits com 16 bits curtos.)

questionAnswers(2)

yourAnswerToTheQuestion