数据类型转换

时间:2021-08-29 04:47:15

四:数据类型转换

前面讲到过双目运算符要求两边数据类型要一样,其次是赋值表达式两边的数据类型也要一样

但是,如果不一样怎么办?比如:当我们计算: 2 + 3.2怎么处理?

1)自动类型转换

 

  大概意思:就是计算机自动帮你转换,不需要你去转换。

如:  2 + 3.2      2 + 2U    5+2L   3.5 + 5L   

自动类型转换必须满足:

 数据类型转换 

水平方向是无条件转换,也就是说 float ab;  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=?(第一步现将ab转换成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;

做这个题应该知道一个知识点:在做赋值表达式时,做赋值号右边的表达式时,是不会管赋值号左边,知道得到一个表达式的值为止。

 

二:强制类型转换

强制类型转换的运算符:  (类型名)被转换的对象

如:求下边表达式的值

  (int3.8

  (double3

  (duoble)(5/2;

  (double5/2

优先级:强制类型转换符也是单目运算符,比双目运算符优先级高。下边是所学运算符的优先级: 

       (1)  ()

       (2)  -  ; ++ ;  -- ; (类型名)。

       (3*    /     %

       (4)  =    +=   -=   *=       /=    %=

        (5)