前言:有这么一道题
下面的代码输出是什么,为什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a + b > 6) ? puts("> 6") : puts("<= 6");
}
显然 我猜测输出 >6,但我不知道为什么,只知道 a 是无符号 int,b是有符号 int
正文:
上面的题涉及到了自动类型转换
- 什么是 自动类型转化
编译系统会在混合运算时进行自动类型转换
- 什么是混合运算
对于双目运算符,两个操作数的数据类型不同,这称为混合运算
- 自动类型转换的原则:
为两个操作数的计算尽可能多的提供存储空间
- 形象的描述转换规则
图中,横向向左的箭头表示必定转换,如short型数据和char型数据进行运算,先将它们转换成int在进行运算
纵向箭头表示当运算对象为不同类型时的转换方向,如int型数据和double型数据进行运算时,int型数据转换成double后再进行运算
有了这些理论依据
回到这道题
是 unsigned int 型 和 int 型 运算,int型转换为unsigned int,unsigned int 没有符号位,且unsigned int 型数据都满足 >= 0,则结果必定大于6,输出> 6