C语言视频 VS2015:[13]类型自动转换
1、无边眠论是前面讲的算术运算符,还将后面要讲解的关系运算符,对于这些二目运算符,在进行开发的过程中,经常会遇到不同类型的操作数混合运算的情况,那么对于这些不同类型的操作数进行混合运算,编译器是如何处理这些不同的类型的呢?
注:二目运算符主要是真需要两个操作数的运算符,如加法,需要两个加数才能够进行,减法也需要两个加数才能够进行等;
2、在C语言里面,隐式类型转换具有以下的原则:
① 当操作数中有一个是long doule类型的时候,另一个操作数将被转换成long double类型;
② 如果上面的条件没有成立,当操作数中一个是double类型的时候,另一个操作数将被转换成double类型;
③ 如果上面两个条件都没有成立,当操作数中一个是float类型的时候,另一个操作数将被转换成float类型;
④ 如果上面的三个条件都没有成立,那么整数类型的转换将遵循下面的原则:
a. 当操作数中一个是unsigned long long 类型的时候,另一个操作数将被转换成unsigned long long类型;
b. 如果上面的条件没有成立,如果一英诸个操作数是long long,另一个操作数将被转换成long long类型;
c. 如果上面的2个条件没有成立,如果一个随陕劣操作数是unsigned long,另一个操作数将被转换成unsigned long类型;
d. 如果上面的3个条件没有成立,如果一个操作数是long,另一个操作数是 unsigned int类型,所有的操作数都将被转换成 unsigned long;
e. 如果上面的4个条件没有成立,如果一个操作数是long,另一个操作数将被转换成long类型;
f. 如果上面的5个条件没有成立,如果一个操作数是unsigned int,另一个操作数将被转换成unsigned int类型;
g.如果上面的条件都不成立,所有的操作数都将被转换成 int 类型;
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/304f0999e92abab89e76734d4814f1c594eea189.jpg)
3、总结一下便是:
① 当操作数中一个是“整数”,另一个是“小数”时,整数将转换成小数;
② 操作数中位数低于int类型的位数的,操作数将都被转换成int类型;
③ 当操作数中出现“类型位数少的”和“类型位数多的”时,类型位数少的将转换成类型位数多的,
④ 当操作数中出现“有符号类型”和“无符号类型”时,有“符号的类型”将被转换成“无符号类型”;
1、“小数”与“小数”运算的情况:
注:为了证明上述的类型转换是成立的,我们需要利用系统的警告来告诉我们答案,所以例子的结果都采用char类型来接收,以便系统可以产生警告;
通过对比源码和警告信息,我们可以发现:
① long double 类型 和 double 类型 运算,结果转换成了long double;
② long double 类型 和 float 类型 运算,结果转换成了long double;
③ double 类型 和 float类型 运算,结果转换成了double;
转换符合C语言里面的隐式类型转换原则;
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/430174fec314f1c575d858723c27ac5307889d89.jpg)
2、"整数"与“整数”运算的情况:
通过警告信息,我们发现发现:
前 5 转换符合了C语言里面的类型自动转换原则,
但是后面的 5 个似乎并不符合C语言的类型自动转换原则?
这主要是由于C语言里面,int 和 unsigned int 类型的特殊性导致的,int 和 unsigned int 类型,在C语言里面可以自由的转换成任意类型,而不会产生警告信息导致的?那后面的五种情况如何证明呢?
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/c255efc595ee41c15511b5e08d88912ca4ca9b89.jpg)
3、int 或 unsigned int 类型虽然可以自由转换成其他的数据类型,但是并能够随便的转换成指针类型,所以修改下面的和的类型为指针类型,编译后,警告出来了:
通过警告信息,我们发现发现:
后 5 转换符合了C语言里面的隐式类型转换原则,
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/906dbbcadce89048e9ca6e44130e5f2042719289.jpg)
4、“整数”和“小数”的情况:
通过警告信息,我们发现发现:
所有的转换符合了C语言里面的隐式类型转换原则,
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/01bd69f7980e5f20ae474668bd20b93acc898e89.jpg)
1、其实在“隐式类型转换举证”部分我们就已经知道了,int类型在c语言里面具有其特殊性,int类型转换原则:
int 或 unsigned int 类型可以隐式的转换成其他的整数类型,而不会产生警告;
具体的例子如下所示:
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/efb861bd4c7c34b370762a095841037de037318e.jpg)
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/3d002dbad341037db100d0c5a9bc7dc5ce672d8e.jpg)
2、有了上面的例子,我们就可以理解了为什么整数初始化的时候,不带后缀而不会产生警告了,如:
char 类型的后缀是 i8,short 类型的后缀是 i16,等,具体的可以看:
http://jingyan.baidu.com/article/fedf07375bb95c35ad89777c.html
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/023cff37c97622bc2ef2d6d4a05fd5460496288e.jpg)
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/7c84d1672b5fd54652a1a1a77fd0b503c9d2248e.jpg)
3、这是由于系统的整数的默认类型就是 int 类型,具体的如下图警告所示:
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/d4071b96b814f4d0ef34d161cdfe474ec383238e.jpg)
1、显示转换又称为强制类型转换,操作比较的直接,直接在需要转换的操作数前面加上“(目标类型)”,就可以进行,但是需要注意的是不同类型的转换
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/f591ab03c8d246fe1a79db30b8bf3bef344f1e8e.jpg)
2、通过错误窗口可以观察到:
① 没有加强制类型转换的第5行,产生了警告,
② 加了强制类型转换“(int)”后的第6行,没有产生警告;
3、通过监视窗口可以观察到:
类型转换后,int类型只保留了double类型的整数部分,小数部分都被截断掉了
4、 方便他人亦是方便自己,如果觉得还行就点下下边的投票吧,这样可以帮助其他人更快的找到解决问题的方法;有疑问的也可留言哦, 谢谢!
![C语言视频 VS2015:[13]类型自动转换](https://exp-picture.cdn.bcebos.com/5e9a2820b93acd89d2f33fbc0335dd8a58de8b89.jpg)