2016-03-22 2 views
1

Например, следующий код:Печатает отрицательные числа как символы, четко определенные в C?

#include <stdio.h> 
#include <limits.h> 

int main(void) 
{ 
    char a; 
    signed char b; 
    for(a = CHAR_MIN, b = CHAR_MIN; a < CHAR_MAX ; a++, b++) 
    printf("%c %c\n", a, b); 
} 

выходы:

! ! 
" " 
# # 
$ $ 
% % 
& & 
' ' 
((
…… 

Когда a и b отрицательные персонажи по-прежнему печатаются на экране. Интересно, хорошо ли это поведение?

Если да, то определяется ли это стандартом или конкретной реализацией? И какой смысл определять такое поведение?

+0

% c предназначен для печати символов. Попробуйте% d. – bruceg

+2

@bruceg Я знаю, и я специально использовал «% c», потому что я хочу знать, как работает «% c», когда передаются отрицательные значения. –

+1

При печати в формате% c бит-бит преобразуется в символ. Попробуйте простой цикл ** для (int c = -127; c <128; C++) printf («% d% c \ n», c, c); ** и изучите вывод вместе с таблицей ASCII. –

ответ

4

Да

Когда значение передается, чтобы соответствовать "%c" он преобразуется в int или unsigned как часть обычных целочисленных поощрений за счет ... из printf() аргументов.

Когда printf() см. Это значение int, оно преобразуется в unsigned char. Затем печатается соответствующий символ.

c Если ни один модификатор l длина не присутствует, то int аргумент преобразуется в unsigned char, и полученный символ записывается. C11dr §7.21.6.1 8

Так прохождения любого типа узкого целое число, которое повышается до int или даже unsigned в диапазоне INT_MAX не является проблемой.

+0

Означает ли это, что только 'unsigned char' может выводиться напрямую? Тогда почему прототипом 'putchar()' является 'int putchar (int character);', а не 'int putchar (unsigned char character);'? –

+0

Подробнее о «даже неподписанном в пределах диапазона INT_MAX не проблема». См. В §6.5.2.2 6 – chux

+1

И, конечно же, «точка» состоит в том, что значение «отрицательное» значение не имеет смысла при применении к «печатный текст». Возможно, это осталось от времени, когда печатные коды символов были извлечены через таблицу поиска - выборка из таблицы поиска с отрицательным индексом является UB и потенциально опасна. Итак, была создана защита. (Все чисто гипотезы.) – usr2564301

0

200 - 11001000 (в двоичном числе), поэтому -200 - 100111000 по одному дополнению.

Размер «char» всего 8 бит, а -200 - 00111000 (= 56 в десятичном числе).

Код ASCII 56 - это «8», и именно поэтому вы можете видеть «8» в качестве вывода.

Если вы распечатаете его как «% d», вы можете увидеть «56» в качестве выхода.

+0

дополнением к 11001000 является 00110111, моя машина в любом случае использует комплимент 2 –

+0

«Размер« char »равен всего 8 бит, а -200 - 00111000 (= 56 в десятичном числе)« Я не думаю, что это гарантия д. – xaxxon

Смежные вопросы