C语言规定,不一样类型的数据须要转换成同一类型后才可进行计算,在整型、实型和字符型数据之间经过类型转换即可以进行混合运算(但不是全部类型之间均可以进行转换)ide
.当混合不一样类型的变量进行计算时,即可能会发生类型转换函数
相同类型的数据在转换时有规则可循:对象
字符必须先转换为整数(C语言规定字符类型数据和整型数据之间能够通用)get
short型转换为int型(同属于整型)编译器
float型数据在运算时一概转换为双精度(double)型,以提升运算精度(同属于实型)博客
赋值时,一概是右部值转换为左部类型it
[注]io
当整型数据和双精度数据进行运算时,C先将整型数据转换成双精度型数据,再进行运算,结果为双精度类型数据编译
当字符型数据和实型数据进行运算时,C先将字符型数据转换成实型数据,而后进行计算,结果为实型数据class
2.4 数据类型转换在C语言的表达式中,准许对不一样类型的数值型数据进行某一操做或混合运算。当不一样类型的数据进行操做时,应当首先将其转换成相同的数据类型,而后进行操做。数据类型转换有两种形式,即隐式类型转换和显示类型转换。
2.4.1 隐式类型转换所谓隐式类型转换就是在编译时由编译程序按照必定规则自动完成,而不需人为干预。所以,在表达式中若是有不一样类型的数据参与同一运算时,编译器就在编译时自动按照规定的规则将其转换为相同的数据类型。
C语言规定的转换规则是由低级向高级转换。例如,若是一个操做符带有两个类型不一样的操做数时,那么在操做以前行先将较低的类型转换为较高的类型,而后进行运算,运算结果是较高的类型。更确切地说,对于每个算术运算符,则遵循图2-2所示的规则。
图2-2 数据类型转换规则之一
注意:在表达式中,全部的float类型都转换为double型以提升运算精度。
在赋值语句中,若是赋值号左右两端的类型不一样,则将赋值号右边的值转换为赋值号左边的类型,其结果类型仍是左边类型。
由于函数参数是表达式,所以,当参数传递给函数时,也发生类型转换。具体地说,char和short均转换为int;float转换为double。这就是为何咱们把函数参数说明为int和double,尽管调用函数时用char和float .
也能够将图2-2所示的规则用图2-3表示。图2-3中的水平箭头表示一定转换,纵向箭头表示两个操做对象类型不一样时的转换方向。
图2-3 数据类型转换规则之二
下面举行说明类型转换的规则。例如执行:
x=100+'a'+1.5 * u+f/'b'-s * 3.1415926
其中,u为unsigned型,f为float型,s为short型,x为float型。式中右面表达式按以下步骤处理:
(1)首先将'a'、'b'和s换成int,将1.5和f转换为double型。
(2)计算100+'a',因'a'已转换为int型,因而此运算结果为197。
(3)计算1.5*u,因为1.5已转换为double,u是unsigned型,因而首先u转换为double,而后进行运算,运算结果为double。
(4)计算197+1.5 * u,先将197转换为double(如197.00…00),其结果为double。
(5)计算f/ 'b',f已转换为double,'b'已转换为int,因而先将'b'再转换为double,其结果为double。
(6)计算(197+1.5 * u)+f / 'b',者均为double,因而结果也为double。
(7)计算s * 3.1415926,先将s由int转换为double,而后进行运算,其结果为double。
(8)最后与前面得的结果相减,结果为double。
(9)最后将表达式的结果转换为float并赋给x。
。
。
。
。
先看程序:
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char**argv){
unsigned int right = 1;
char left = -1;
if(left < right)printf("%d < %d\n", left, right);
else if(left == right)printf("%d = %d\n", left, right);
else printf("%d > %d\n", left, right);
system("PAUSE");
return 0;
}
运行结果是:-1 > 1
解释:按步骤进行.
1. 若是其中一个操做数为long double类型,则另外一个操做数被转换为long double.
2. 不然,若是其中一个操做数为double, 则另外一个操做数被转换为double.
3. 不然,若是其中一个操做数为float, 则另外一个操做数也转换为float.
4. 不然,两个操做数进行 "整型升级":
a. 若是其中一个操做数为unsigned long int, 则另外一个操做数也被视为unsigned long int.
b. 不然,若是其中一个操做数为long int,而另外一个操做数类型是unsigned int, 而且long int可以表示unsigned int的全部值,则另外一个操做数也被视为long int;若是long int不能表示unsigned int的全部值,则两个数都被视为unsigned long int.
c. 不然, 若是其中一个操做数是long int,则另外一个操做数也被视为long int.
d. 不然, 若是其中一个操做数是unsigned int, 则另外一个操做数也被视为unsigned int.
e. 不然, 两个操做数都被视为int.