编译器如何在超出范围的char值上运行?

时间:2018-03-13 12:02:54

标签: c char type-conversion

char ch = 1107;
printf("ch = %c", ch);

以上代码打印S。

我不明白这是怎么回事。我给出了char类型的超出范围值。编译器如何获得这个值" S" (ASCII 83)?

2 个答案:

答案 0 :(得分:1)

如果1107太大而无法放入char(通常只有char可能大于8位),charunsigned,那么1107被转换为具有正常环绕行为的char。如果charsigned,则转换是实现定义的,并且可能会引发实现定义的信号。

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类型的对象,