Помогите разобраться.
Мне нужно 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. Поясните плз в чем тут фишка?