Лучшее понимание printf - Что печатается с "% c", когда предоставленное значение отрицательно? - PullRequest
1 голос
/ 18 июля 2011

В Kernighan & Ritchie говорится, что «все печатные символы положительны, хотя тип данных char, подписанный или неподписанный, зависит от машины».

Может кто-нибудь объяснить мне значение этой строки?Моя система имеет подписанные символы, но даже с отрицательным значением, скажем, -90, printf печатает символ (хотя это не очень знакомый символ).

Ответы [ 3 ]

2 голосов
/ 18 июля 2011

Набор символов ASCII определяет кодовые точки от 0x00 до 0x7F. Неважно, представлены ли они байтовыми значениями без знака или со знаком, так как этот диапазон является общим для обоих.

Печатные символы находятся между 0x20 и 0x7E, которые являются частью ASCII. Термин печатный символ не определяет все возможные символы в мире, который можно печатать. Скорее, это определено внутри царства ASCII.

Значения байтов от 0x80 до 0xFF не определены в ASCII, и разные системы присваивают разные символы значениям в этом диапазоне, что приводит к множеству различных типов кодовых страниц, которые идентичны в своем диапазоне ASCII, но различаются в этом диапазоне. Это также диапазон, в котором значения для байтов со знаком и без знака различаются.

Реализация printf ищет однобайтовое значение, когда встречается с ключом %c при вводе. Это значение байта может быть подписано или не подписано относительно вашей точки зрения как вызывающей функции printf, но printf этого не знает. Он просто передает эти 8 бит в выходной поток, к которому он подключен, и этот поток испускает символы в пределах 0x00 и 0xff.

Понятие знака не имеет смысла в выходном конвейере, где испускаются символы. Таким образом, независимо от того, отправляете ли вы 255 или -1, отображается символ, сопоставленный с 0xFF в конкретной кодовой странице.

1 голос
/ 18 июля 2011

Это верно.Все двоичные числа положительны.Относитесь ли вы к этому негативно или нет - ваша собственная интерпретация.Используя комплимент общих двух .

8-битное число: 10100110 - это положительное 166, что больше 128 (максимальное 8-битное число с положительным знаком).

Используя арифметику со знаком, число 166 равно -90.

Вы видите символ, значение ascii которого равно 166.

1 голос
/ 18 июля 2011

-90, поскольку подписанный символ повторно интерпретируется как неподписанный символ, и в этом случае его значение равно 166. (Оба значения -90 и 166 равны 0xA6 в шестнадцатеричном формате.)

...