Diferencia práctica entre int y char

Tengo que analizar la salida de estos fragmentos de código:

int x, y; x = 200; y = 100; x = x+y; y = xy; x = xy; printf ("%d %d\n", x, y); char x, y; x = 200; y = 100; x = x+y; y = xy; x = xy; printf ("%d %d\n", x, y); 

Por lo tanto, ahora sé que int significa entero y char para carácter; He leído sobre las diferencias y si pongo en la printf el %d , se devuelve en forma de dígitos, y %c , en forma de un carácter.

El código de caracteres ASCII para 'A' es 65 por ejemplo, pero ¿por qué la segunda función imprime 100 -56 , en lugar de 100 200 ?

En la plataforma utilizada en la pregunta, el tipo char parece tener un tamaño de 1 byte (8 bits) y es un tipo con signo con 1 bit de signo y 7 bits de valor (y utiliza la aritmética de complemento de 2). Almacena valores de -128 a 127. Entonces, esto es lo que está sucediendo con x e y :

 x = 200 => x takes value -56 y = 100 => y takes value 100 x = x+y => x takes value 44 y = xy => y takes value -56 x = xy => x takes value 100 

C tiene una variedad de tipos de enteros: char (al menos 8 bits), short (al menos 16 bits), int (al menos 16 bits), long (al menos 32 bits). Hay variedades unsigned de esos. Si asigna un valor que es demasiado grande para un tipo simple, los resultados no están definidos (nunca debe hacer eso, el comstackdor puede suponer que nunca lo hace, y no lo comprueba). En el caso unsigned , se “envuelven”. Pero tenga en cuenta que los tamaños no están garantizados , solo sus tamaños mínimos. Ha habido máquinas en las que todas tenían 32 bits de ancho.