Вы сами нашли, что означают "% 02x" и "% 03o". Это хорошо!
Итак, ваш вопрос сводится к "Что такое непечатные символы?"и «Как они печатаются в указанных форматах?»
Непечатаемый символ определяется (в указанном источнике) строкой printable
в функции can_print()
. Все символы, не входящие в эту строку, преднамеренно определены как недоступные для печати. Мы можем рассуждать о выборе, но здесь это выходит за рамки. Еще одно примечание: «» и «\ t \ f \ v \ r \ n» находятся в этом наборе печатных символов и имеют значение <= 0x20 в ASCII. </em>
BTW, стандартная библиотекаимеет isprint()
, который проверяет на пригодность для печати.
Как вы, кажется, знаете, каждый символ кодируется как присвоенное значение. Это значение можно интерпретировать как угодно, как символ, как число, как инструкцию, как цвет, как битовый шаблон, что угодно. На самом деле все цифровые компьютеры работают только с битовыми шаблонами, это зависит от их интерпретации.
Таким образом, непечатаемый символ можно интерпретировать как число int
, и это то, что происходит с помощью printf()
с указанным форматом. Допустим, что прочитанным символом является '\ b', известное как backspace. (Примечание: его нет в printable
.) В ASCII этот символ кодируется как 0x08. Таким образом, выходные данные будут «08» и «010» соответственно.
Вы можете изменить программу таким образом, чтобы все символы считались непечатными. Тогда вы увидите все символы, выводимые в шестнадцатеричном или восьмеричном виде.