例如,以下代码:
#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 :(得分: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'作为输出。