将负数打印为在C中定义好的字符?

时间:2016-03-22 22:49:29

标签: c char printf

例如,以下代码:

#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);
}

输出:

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

ab为否定时,屏幕上仍然会打印字符。我想知道这种行为是否定义明确?

如果是,是由标准还是具体实施来定义?那么定义这种行为有什么意义呢?

2 个答案:

答案 0 :(得分:4)

当值传递到匹配"%c"时,由于int unsigned,它会转换为...printf()作为常规整数促销的一部分1}}参数。

printf()看到int值时,它会转换为unsigned char。然后打印相应的字符。

  

c如果不存在l长度修饰符,则int参数将转换为unsigned char,并写入生成的字符。 C11dr§7.21.6.18

因此,在int范围内传递任何提升为unsigned甚至INT_MAX的窄类型整数都不是问题。

答案 1 :(得分:0)

200是11001000(二进制数),所以-200是100111000的补码。

'char'的大小只有8位,-200是00111000(十进制数= 56)。

56的ASCII码是'8',这就是你可以看到'8'作为输出的原因。

如果您将其打印为'%d',则可以看到'56'作为输出。