同种数据类型的变量在进行运算的时候,我们都知道怎么去运算
比如int a = 5, b = 10;
那么a+b的结果也是int类型的;
如果是不同的数据类型的变量在进行混合运算的时候,就需要将其转换成同种数据类型,然后再进行运算
比如:int = 5;
float b = 10.5;
a+b的结果是多少呢?
这就牵扯到了我们所说的隐式类型转换啦,我们先来看一副图:
从上图中,我们可以看到,float类型转换成了double类型的,int类型也要转换成double的,然后才可以进行运算,也就是说a+b的结果就是15.5啦
我们来验证一下:
我们看到代码运行的结果a+b的结果为浮点数,大家可以试一下,14行代码如果改成%d的话,编译时就会有类型不匹配的警告,所以int类型与float类型在进行混合运算的时候,都转换成了double类型。
再继续回到图2-3,我们可以看到图中有两个方向的箭头,都分别表示什么意思呢?
同样我们举例说明,先来看竖向箭头:
我们可以看到a+b的结果是大于0的,那么也就是说int类型与unsigned int类型在进行混合运算的时候,先转换为unsigned int类型,然后再进行运算。
同样,我们再来看一个横向箭头的例子:
可以发现,sizeof(a+b)的结果为4,如果a+b还是char类型的话,结果应该是1,我们结合图2-3,也就是说char类型在进行运算的时候,势必要向int类型转换,不管有没有进行混合运算。
再来看一个例子:
打印的结果为a + b <= 0,结合图2-3,我们可以推断出char类型与unsigned char在进行运算时,都转换成了int类型,同样,如果将char改成short,unsigned char改成unsigned short,结果也是a + b <= 0,那就说明了short与unsigned short在进行运算时,也都转换成了int。
所以:我们可以总结出,竖向箭头表示不同的数据类型在进行混合运算的时候,会有一个低字节向高字节转换的过程,横向箭头表示不管该类型有没有进行混合运算都势必会进行转换,再进行运算,但是需要注意:比如int类型与double类型进行运算,不是int->unsigned->long->double这么一个过程,而是int类型会直接转换成double类型。
后,再强调一点,我们说int与double类型运算时,int会转换成double,如下图:
我们可以看出,在编译时,出现了警告,说明实际上a的类型实质上并没有转换成double类型的,而只是在运算的过程中发生了转换。