隐式转换通常发生在以下这几种情况:
1、在一个运算表达式中存在多种类型的混合运算
int inum = 2;
char cstr = 10;
double dnum = 3.14;
//在inum+cstr+dnum运算前,inum,cstr的值被提升为double类型
printf("%lf",inum+cstr+dnum);
2、调用一个函数的时候,传递的参数或者返回变量的类型与原函数不匹配
double add_sub(int inum,char cstr)
{
if(cstr < 'a') //字符常量‘a’的类型是int,cstr将被提升为int再进行比较
{
return inum-cstr; //返回值被提升为double类型
}
return inum+cstr;
}
//不难想象,下面的输出大小为:4
void test(void)
{
printf("%d",sizeof('a'));
}
3、当表达式中存在有符号类型和无符号类型的时候,所有的操作数都自动转换为无符号类型
#include <stdio.h>
int main()
{
int val1 = -20;
unsigned int val2 = 6;
(val1 + val2 > 6) ? puts("bigger than 6") : puts("smaller than 6");
printf("val1的十六进制储存是 %x",val1);
return 0;
}
输出结果:
因为负数是以补码形式存储的,(为了方便分析,前面位的0/1位暂时省略)20的原码10100,反码为01011,补码(反码加1)为01100,所以-20的十六进制储存即为 ffff ffex。