char ch = 1107;
printf("ch = %c", ch);
以上代码打印S。
我不明白这是怎么回事。我给出了char类型的超出范围值。编译器如何获得这个值" S" (ASCII 83)?
答案 0 :(得分:1)
如果1107太大而无法放入char
(通常只有char
可能大于8位),char
为unsigned
,那么1107被转换为具有正常环绕行为的char
。如果char
为signed
,则转换是实现定义的,并且可能会引发实现定义的信号。
此ch
扩展为int
,因为它在变量参数列表中传递。
在printf
内部,int
转换为unsigned char
,并应用正常的环绕式规则。
答案 1 :(得分:0)
运行此演示程序
#include <stdio.h>
int main(void)
{
printf( "%#x\n", 1107 );
printf( "%c\n", 0x53 );
return 0;
}
它的输出是
0x453
S
因此可以看出,编译器只提取整数常量的最低字节,并将存储的值赋给char类型的对象,