Странный вывод при печати значения 0x89 (-119)

Как видно из заголовка, я получаю «странный» результат при выполнении следующего кода:

#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;
}

Выход:

0x40398917
0x40
0x39
0xffffff89
0x17

Почему я не получаю0x89 ?

Ответы на вопрос(3)

Ваш ответ на вопрос