printf () приводит к бреду

У меня есть этот код:

unsigned char *command = "0000";
unsigned char foo = (hex_char_to_int(command[0]) << 4) | hex_char_to_int(command[1]);
unsigned char bar = (hex_char_to_int(command[2]) << 4) | hex_char_to_int(command[3]);
printf("foo: %02x, bar: %02x\r\n", foo, bar);

Он использует эту функцию:

unsigned char hex_char_to_int(unsigned char ch) {
    switch (ch){
        case '0': return 0;
        case '1': return 1;
        case '2': return 2;
        case '3': return 3;
        case '4': return 4;
        case '5': return 5;
        case '6': return 6;
        case '7': return 7;
        case '8': return 8;
        case '9': return 9;
        case 'A': return 0xA;
        case 'B': return 0xB;
        case 'C': return 0xC;
        case 'D': return 0xD;
        case 'E': return 0xE;
        case 'F': return 0xF;
        case 'a': return 0xA;
        case 'b': return 0xB;
        case 'c': return 0xC;
        case 'd': return 0xD;
        case 'e': return 0xE;
        case 'f': return 0xF;
        default: return 0;
    }
}

Это результат:

"JW\xd6\x96'$LK\x90\xbbar: 3030\r\r\n"

Это на компиляторе Keil C51, на AT89C55WD, сprintf() переходя через последовательный порт.

Что происходит?

РЕДАКТИРОВАТЬ

Я изменяю строку printf на

printf("%02x%02x\r\n", (unsigned int)foo, (unsigned int)bar);

Так что похоже на ошибку вprintf, Пожалуйста, программисты, никогда не создавайте инструмент отладки, который лжет. Умоляю вас.

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

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