为何unsigned short int与signed char间未发生隐式类型转换?
C语言隐式类型转换差异问题解析
先看第一段代码及运行结果:
#include <stdio.h> int main() { short int a = -1; // ----> Line 1 unsigned int b = 122; // ----> Line 2 if (a > b) printf("a is big"); else printf("a is small"); return 0; }
输出:a is big
这段代码里,short int类型的a在和unsigned int类型的b比较时,会触发寻常算术转换:因为unsigned int的类型秩(rank)比short int高,所以a会被隐式转换为unsigned int类型。-1转成unsigned int后是该类型的最大值(比如32位系统下是4294967295),自然比122大,所以输出a is big。
再看第二段代码及运行结果:
#include <stdio.h> int main() { char a = -1; // ---> Line 3 unsigned short int b = 122; // ---> Line 4 if (a > b) printf("a is big"); else printf("a is small"); return 0; }
输出:a is small
你疑惑为什么这里没按预期把signed char转成unsigned short int?核心原因是**整数提升(Integer Promotion)**先于寻常算术转换执行:
- 对于变量
a:char类型(这里是有符号的,因为赋值了-1)会先被提升为int类型——因为int的范围完全能覆盖char的所有取值(signed char范围是-128到127,int至少能覆盖-32768到32767),所以a提升后是int类型的-1。 - 对于变量
b:unsigned short int类型同样会被提升为int类型——因为unsigned short的最大值(65535)也在int的取值范围内(32位int范围是-2147483648到2147483647),所以b提升后是int类型的122。
现在比较的是两个int类型的值:-1和122,显然-1 < 122,所以输出a is small。根本没走到char转unsigned short那一步,因为整数提升已经把两者都转成int了。
内容的提问来源于stack exchange,提问作者sai praveen
相关产品推荐
相关产品推荐

