Salida extraña al imprimir el valor 0x89 (-119)

Como dice el título, obtengo un resultado "extraño" al ejecutar el siguiente código:

#include <stdio.h>

int main()
{
    char buff[4] = {0x17, 0x89, 0x39, 0x40};
    unsigned int* ptr = (unsigned int*)buff;
    char a = (char)((*ptr << (0*8)) >> (3*8));
    char b = (char)((*ptr << (1*8)) >> (3*8));
    char c = (char)((*ptr << (2*8)) >> (3*8));
    char d = (char)((*ptr << (3*8)) >> (3*8));

    printf("0x%x\n", *ptr);
    printf("0x%x\n", a);
    printf("0x%x\n", b);
    printf("0x%x\n", c);
    printf("0x%x\n", d);

    return 0;
}

Salida:

0x40398917
0x40
0x39
0xffffff89
0x17

Porque no estoy recibiendo0x89 ?

Respuestas a la pregunta(3)

Su respuesta a la pregunta