zHz00 Untitled

вторник, 25 апреля 2017
23:59 signed char и шестнадцатеричное представление
Допустим, мы хотим увидеть char в шестнадцатеричном виде при помощи printf или аналогичной функции. Это бывает нужно для организации логирования дампов двоичных массивов при приёме/передаче данных, скажем.

Нас ждёт разочарование. char по умолчанию signed. Спецификатор для шестнадцатеричных чисел -- %x. Но он работает с числами размером с int. signed char будет преобразован в unsigned int, и все старшие биты будут забиты единичками из-за дополнительного кода. То есть, вместо 0x2F мы увидим 0xFFFFFF2F (при форматное строке "0x%02x").

Что же делать?
1. Забыть про массивы char. Использовать либо unsigned char, либо новомодный (лет пять-десять как) uint8_t.
2. Использовать двойное преобразование типов. Это лол. Я не ожидал, что это сработает:

printf( "0x%02x ",(unsigned int)(unsigned char)buffer[offset]);

@темы: Программирование

URL
http://www.text-image.com/convert/
"Во время кризиса самое главное - не потерять голову...
Ушла из дома[изображение]).Йоу! И теперь все кувырком, но...
В моей не было столько текста. Приготовьтесь, грузится до...
Со словами трудно, действительно придется попробовать сыг...
Это ва не...

30.04.2017 в 14:04

30.04.2017 в 14:04
В GNU libc для этого есть специальный модификатор hh, благодаря которому можно писать вот так:



Подробности в мане: manpages.debian.org/jessie/manpages-dev/printf.3.en.html#The_length_modifier

А за упоминание дополнительного кода спасибо. Я, когда с единичками в верхних битах недавно столкнулся, почему-то не догадался, что это с знаковостью связано.

-- Minoru
URL

30.04.2017 в 14:10

30.04.2017 в 14:10
Minoru

У меня данная ситуация касалась MSVS, но с ГНУ работать тоже приходится, изучу, спасибо.

>>Подробности в мане

Кто такая маня?))
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии