四:数据类型转换
前面讲到过双目运算符要求两边数据类型要一样,其次是赋值表达式两边的数据类型也要一样
但是,如果不一样怎么办?比如:当我们计算: 2 + 3.2怎么处理?
1)自动类型转换
大概意思:就是计算机自动帮你转换,不需要你去转换。
如: 2 + 3.2 2 + 2U 5+2L 3.5 + 5L
自动类型转换必须满足:
水平方向是无条件转换,也就是说 float a,b; a+b;表面上他们类型一样是不需要转换的,但是系统自能将float转换成double然后在转换。它是系统无条件执行。
问题:3.5+2.3设计到类型转换么?
不涉及到,因为浮点型的常量默认是double型。
例题:‘A’+12+10.2怎么转换的?
赋值运算的转换:
在赋值运算中,他的转换很特殊。如果在赋值号两端的类型不一致,他与上面的自动转换不一样。系统会以赋值号左边变量的值为基础,将右边的值转换成左边,即使右边的数据类型的级别高于左边,还是会以变量为基础,他也属于一种特殊的自动类型转换。
如: int a;
a = 3.5;
结果a的值是3.
为什么会出现上面的原因:因为在C语言中,定义一个变量相当于在内存中开辟了一块空间,该空间是用来存放一种固定类型的数据的,如果你将另外一个数据类型赋给这个变量来存储,系统是不能改变这个开辟的空间的属性的,因此你存放的时候,系统会自动的将这个数据转换成这个变量的类型来存储。
例题:
①double i ;
i = 1;
printf(“%f”,i);结果i的值是多少?
②short a =1000;
Char b = ‘B’
Long c = 80000;
C = a +b;
结果:C=?(第一步现将a,b转换成int,再将结果转换成long型)
③ int i;
i = 0x1234567890LL
结果:i=??? (取低位)
例题:long a, b ,c;
a = 1000000L;
b = 1000*1000LU;
c = 0x4321*0x98765;
Printf(“%d,%ld,%ld”,a,b,c);
做这个题应该知道一个知识点:在做赋值表达式时,做赋值号右边的表达式时,是不会管赋值号左边,知道得到一个表达式的值为止。
二:强制类型转换
强制类型转换的运算符: (类型名)被转换的对象
如:求下边表达式的值
(int)3.8;
(double)3;
(duoble)(5/2);
(double)5/2
优先级:强制类型转换符也是单目运算符,比双目运算符优先级高。下边是所学运算符的优先级:
(1) ()
(2) - ;+ ; ++ ; -- ; (类型名)。
(3)* / %
(4) = += -= *= /= %=
(5) ,