【发布时间】:2018-08-21 16:21:18
【问题描述】:
char ch = 1107;
printf("ch = %c", ch);
上面的代码打印 S.
我不明白这是怎么发生的。我给出了一个超出范围的 char 类型值。编译器如何得到这个值“S”(ASCII 83)?
【问题讨论】:
标签: c char type-conversion
char ch = 1107;
printf("ch = %c", ch);
上面的代码打印 S.
我不明白这是怎么发生的。我给出了一个超出范围的 char 类型值。编译器如何得到这个值“S”(ASCII 83)?
【问题讨论】:
标签: c char type-conversion
运行这个演示程序
#include <stdio.h>
int main(void)
{
printf( "%#x\n", 1107 );
printf( "%c\n", 0x53 );
return 0;
}
它的输出是
0x453
S
所以编译器只提取整数常量的最低字节并将存储的值分配给 char 类型的对象,
【讨论】:
printf("%d\n", (char) 1107); 一个更好的例子来展示这种行为吗?
53 应该是0x53。
printf( "%c\n", 0x1153 );,因为现在高字节(0x11)将被“切掉”,只有低字节(0x53)会被打印出来,那就是字母S。
如果 1107 太大而无法放入 char(通常是,但 char 可能大于 8 位),并且 char 是 unsigned,则 1107 将转换为 char具有正常的环绕行为。如果char 是signed,则转换是实现定义的,并且可能会引发实现定义的信号。
在此ch 扩展为int 之后,因为它在变量参数列表中传递。
在内部,在 printf 内部,int 被转换为 unsigned char,应用正常的环绕规则。
【讨论】:
ch 的类型:所有有影响力的缩小转换都发生在那里。