Неопределенное поведение при печати 0x85 или 0x95 - PullRequest
2 голосов
/ 17 июня 2011

Когда я пытаюсь напечатать 0x15 в 0x75, используя printf("%2x"), я вижу ожидаемый результат:

15
75

Но если я попытаюсь напечатать 0x85 или 0x95, получим 0xffffff85 и 0xffffff95 в качестве вывода. Почему это?

#include <stdio.h>

int main()
{
  char test = 0x85;
  printf("\n test hex: %2x \n", test);
  return 0;
}  

Выход:

test hex: ffffff85

Ответы [ 3 ]

8 голосов
/ 17 июня 2011

Попробуйте u_char (хорошо unsigned char, R правильно) test;

char подписан для вас и преобразуется в int. Если установлен старший бит 0x80, он становится отрицательным числом.

3 голосов
/ 17 июня 2011

Поскольку проверка представляет собой знаковое char, а 0x85 и 0x95 (фактически любые значения между 0x80 и 0xFF) имеют бит старшего разряда, результат будет установлен со знаком-расширенным с 1, когда он повышен из charв int.

Попробуйте объявить тест неподписанным символом.

2 голосов
/ 17 июня 2011

Как небольшое расширение ответа Сета, вы печатаете шестнадцатеричное число целой ширины. (Это то, что говорит ваша строка формата).

Если вы хотите напечатать шестнадцатеричное число размером с символ, вы можете использовать:

printf("test hex: %2hhx\n", test);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...