[Решено] C, printf char as hex (Не получается вывести char длины 1 байт в hex виде)

Модератор: Модераторы разделов

FlySnake
Сообщения: 992
ОС: openSUSE

[Решено] C, printf char as hex

Сообщение FlySnake »

Всем привет
Помогите разобраться.
Мне нужно char вывести в hex виде. Код такой:

Код: Выделить всё

printf("const char digits[]={%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x,%#x}; \n",~getdig(0),~getdig(1),~getdig(2),~getdig(3),~getdig(4),~getdig(5),~getdig(6),~getdig(7),~getdig(8),~getdig(9));

Функция getdig() возвращает unsigned char, затем его инвертируем и хотим напечатать в хексе, но строго длиной 1 байт. У меня же получается примерно такой выхлоп:

Код: Выделить всё

const char digits[]={0xffffffc0,0xfffffff9,0xffffffa4,0xffffffb0,0xffffff99,0xffffff92,0xffffff
82,0xfffffff8,0xffffff80,0xffffff90};

т.е. как бы char кастится до интеджера, инвертируется и печатаются все 4 байта включая лидирующие единицы (либо минус в случае с signed). Но этого не нужно. Пробовал добавить касты (char)~getdig() - тоже самое.
Если не инвертировать выхлоп getdig() то получается как надо, но видимо потому что лидирующие нули отбрасываются и печатается так же интеджер длиной байт.
Решл проблему внаглую: (~getdig(5))&0xFF т.е. погасив старшие биты. Но суть вопроса не в этом.
Ведь char`ы ведут себя как интеджеры в арифметике и логике, так? Почему же получается что printf печатает их длиной как интеджеры? Попробовал printf("%d.... - тоже самое, только получается отрицательный десятичный интеджер. Получается printf сначала кастит char`ы до signed int, а потом уже этот интеджер печатает в хексе? Ещё не понял как работает флаг "-" у printf. Вроде как должен гасить знак (лидирующие единицы), но у меня он ничего не изменяет. Тоже самое с указанием кол-ва значащих цифр как (аля %3d) не работает для %x. Поясните плз в чем тут фишка?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: [Решено] C, printf char as hex

Сообщение eddy »

А с чего вы взяли, что тип gid_t - unsigned char?
Вот же:

Код: Выделить всё

typedef __uint32_t      __gid_t;

Так что, его поведение верно.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: [Решено] C, printf char as hex

Сообщение FlySnake »

В смысле тип gid_t ? У меня функция getdig самописная, определена

Код: Выделить всё

 unsigned char getdig(unsigned int dig)
{бла-бла-бла}

Или вы имеете ввиду стандартную getgid ? Так оно пишется по-другому, и в инклюдах у меня только stdio и string :) Прога элементарнейшая, даже работает, но непонятка с этим printf не даёт успокоится
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5412
ОС: Gentoo

Re: [Решено] C, printf char as hex

Сообщение /dev/random »

%x - это тип int. Единственное, почему ваша программа вообще хоть как-то работает, а не сегфолтится, это потому, что при передаче параметра char он временно конвертируется в int.
Во-первых, укажите в строке формата реальный тип. Для char это %hhx. Во-вторых, неплохо бы указать, до скольких цифр расширять строку, если она короткая. Т.е. %02hhx. Ну и эта ваша решётка, т.е. %#02hhx. Хотя для совместимости её лучше избегать, и писать 0x вручную, т.е. 0x%02hhx
Спасибо сказали:
FlySnake
Сообщения: 992
ОС: openSUSE

Re: [Решено] C, printf char as hex

Сообщение FlySnake »

/dev/random снова выручил :)
ичсх про это неплохо написано в википедии - туда я как-то не догадался заглянуть :)
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: [Решено] C, printf char as hex

Сообщение agentprog »

/dev/random писал(а):
26.02.2011 14:20
Для char это %hhx

если компилировать при помощи gcc (и подобных, типа MinGW), то так. у меня подобная конструкция не понималась толи студийным компилятором, толи борландовым. причем так и не нашел как сделать подобную штуку там. хотя, это и оффтопик :)
No problems - just solutions!
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5412
ОС: Gentoo

Re: [Решено] C, printf char as hex

Сообщение /dev/random »

agentprog писал(а):
26.02.2011 20:00
если компилировать при помощи gcc (и подобных, типа MinGW), то так. у меня подобная конструкция не понималась толи студийным компилятором, толи борландовым. причем так и не нашел как сделать подобную штуку там. хотя, это и оффтопик :)

Во всех компиляторах, соблюдающих стандарты, это работать будет. А "студийный" и "борландовский" компиляторы - это, ЕМНИП, только C++, и ждать от них корректной компиляции программ на C бессмысленно.
Спасибо сказали: