Anular la referencia a este puntero me da -46, pero no estoy seguro de por qué

Este es un programa que ejecuté:

#include <stdio.h>

int main(void)
{
    int y = 1234;
    char *p = &y;
    int *j = &y;
    printf("%d %d\n", *p, *j);
}

Estoy un poco confundido acerca de la salida. Lo que estoy viendo es:

-46 1234

Escribí este programa como un experimento y no estaba seguro de lo que iba a generar. Esperaba posiblemente un byte dey.

¿Qué está pasando "detrás de escena" aquí? ¿Cómo funciona la desreferenciación?p Dame-46?

Como señalaron otros, tuve que hacer un casting explícito para no causar UB. No estoy cambiando esa línea dechar *p = &y; achar *p = (char *)&y; para no invalidar las respuestas a continuación.

Este programa no está causando ningún comportamiento de UB como se indicaaquí.

Respuestas a la pregunta(4)

Su respuesta a la pregunta