C语言中字符常量负值问题:多字节字符的char转int是否合理?
关于多字节字符常量与char到int转换的合理性分析
首先要明确C语言里两种字符常量的本质区别:
单字节字符常量:比如《C语言速查手册》中的示例:
int c = '\xA3'; // 英镑符号(ISO/IEC 8859-1编码为单字节0xA3) printf("Character: %c Code: %d\n", c, c);这类单字节字符常量的类型是
char,赋值给int变量时会触发char到int的转换。如果char是有符号类型,且字符编码值超过有符号char的最大值(127),就会按补码规则转换为负数——比如0xA3(163)转换后就是-93,对应书中的输出结果。多字节字符常量:像你测试的阿拉伯字符
'م',在UTF-8编码中它占用两个字节(0xD9 0x85),此时它属于C语言中的多字节字符常量,标准明确规定这类常量的类型是int,而非char。你执行printf("%d\n", 'م')得到的55685,实际是该字符的多字节编码按系统字节序拼接成的整数值(0xD985的十进制就是55685)。
所以结论很明确:讨论char到int的转换仅适用于单字节字符常量,多字节字符常量本身就是int类型,不存在从char转换到int的过程,此时再谈这个转换逻辑是不合理的。
内容的提问来源于stack exchange,提问作者apadana
相关产品推荐
相关产品推荐

