Почему один символ символа появляется на 4 байта на языке Си - PullRequest
3 голосов
/ 12 апреля 2019

Я кодирую код C и хочу сравнить шестнадцатеричное значение одного символа с другим. Это работает, но с некоторым значением типа я получил значение в 4 байта, что не имеет смысла в моем сравнении.

void obs_text(char* start, unsigned char debugLevel, unsigned char depth){
    printf("%c -> 0x%x\n", start[0], start[0]);
}

Я ожидал вывод с двумя шестнадцатеричными символами, но фактический вывод - ? -> 0xffffffef. Пожалуйста, кто-нибудь понимает, что происходит? Спасибо за вашу помощь.

Я компилирую с gcc.

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.2.0
Thread model: posix

но я также пытаюсь установить ОС Debian с той же проблемой

Ответы [ 2 ]

2 голосов
/ 12 апреля 2019

Поскольку %x означает отображение в виде целого числа без знака (4 байта) как шестнадцатеричного. Смотри http://www.cplusplus.com/reference/cstdio/printf/

Как уже отмечалось, вы можете использовать %hhx (добавлено в C99), чтобы получить ожидаемое поведение (подробнее см. в этом ответе ).

0 голосов
/ 12 апреля 2019

Используйте %hhx и приведите аргумент к unsigned char:

printf( "%c - 0x%hhx", start[0], (unsigned char) start[0] );

%x ожидает, что соответствующий аргумент будет иметь тип unsigned int. Вам нужно использовать модификатор длины hh, чтобы сообщить, что вы имеете дело со значением unsigned char.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...