Набор символов ASCII определяет кодовые точки от 0x00
до 0x7F
. Неважно, представлены ли они байтовыми значениями без знака или со знаком, так как этот диапазон является общим для обоих.
Печатные символы находятся между 0x20
и 0x7E
, которые являются частью ASCII. Термин печатный символ не определяет все возможные символы в мире, который можно печатать. Скорее, это определено внутри царства ASCII.
Значения байтов от 0x80
до 0xFF
не определены в ASCII, и разные системы присваивают разные символы значениям в этом диапазоне, что приводит к множеству различных типов кодовых страниц, которые идентичны в своем диапазоне ASCII, но различаются в этом диапазоне. Это также диапазон, в котором значения для байтов со знаком и без знака различаются.
Реализация printf
ищет однобайтовое значение, когда встречается с ключом %c
при вводе. Это значение байта может быть подписано или не подписано относительно вашей точки зрения как вызывающей функции printf
, но printf
этого не знает. Он просто передает эти 8 бит в выходной поток, к которому он подключен, и этот поток испускает символы в пределах 0x00
и 0xff
.
Понятие знака не имеет смысла в выходном конвейере, где испускаются символы. Таким образом, независимо от того, отправляете ли вы 255
или -1
, отображается символ, сопоставленный с 0xFF
в конкретной кодовой странице.