Спецификатор формата для шестнадцатеричного символа в C
-
12-12-2019 - |
Вопрос
Существует ли спецификатор формата для sprintf
в C, который отображает a char
колдовать таким же образом, как %x
отображает int
чтобы заколдовать?
Решение
Да и нет.
С sprintf
принимает список переменных аргументов, все аргументы перед этим подвергаются повышению по умолчанию. sprintf
получает их.Это значит sprintf
воля никогда получить char
-- а char
всегда будет повышен до int
до sprintf
получает его (и short
тоже будет).
Да, с чего sprintf
получает будет int
, вы можете использовать %x
чтобы преобразовать его в шестнадцатеричный формат, и оно будет работать одинаково, независимо от того, начинается ли это значение как char
, short
, или int
.Если (как это часто бывает) вы хотите напечатать 2 символа для каждого ввода, вы можете использовать %2.2x
.
Однако обратите внимание на один момент:если ваш char
подписан, и вы начинаете с отрицательного значения, продвижение по int
выдаст то же числовое значение, которое обычно не будет быть той же битовой комбинацией, что и исходный символ, поэтому (например) символ со значением -1
обычно распечатывается как ffff
если int
составляет 16 бит, ffffffff
если int 32 бита, или ffffffffffffffff
если int
составляет 64 бита (при условии типичного представления дополнения до 2 для целых чисел со знаком).
Другие советы
Это то же самое %x
.Все char
значения преобразуются в int
перед передачей в sprintf
(или любая другая функция, принимающая переменное количество параметров).
printf("%x\n", 'a');
печать 61