Fiyang

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1、在进行自动类型转换的时候,如果原来的数是无符号数,那么在扩展的时候,高位填充的是0;如果是有符号数,那么高位填充的时符号位!这一点有点类似于“>>”操作符,当无符号数右移的时候,高位填充的是0;有符号数右移的时候,高位填充的是符号位。C语言的类型转换,可以分为两种:自动类型转换(隐式类型转换,有编译器帮你去完成)和强制类型转换(你知道自己想要什么,所以才转换)。

    自动类型转换

    最常见的就是混合运算以及赋值运算,还有一种就是函数值的类型转换

  1. 赋值运算:自动把“=”右边的表达式的类型转换成“=”右边的变量的类型,例如 int a=4.5; a的值实际是4!
  2. 混合运算:就是一个运算表达式当中包含了多个类型,这时候就需要有类型转换。当运算符两边的操作数类型不同时,其中一个操作数就要经过类型转换以和另一个操作数的类型相一致,然后才能进行运算。
    变换操作数采取就高不就低的原则,即级别低的操作数先被转换成和级别高的操作数具有同一类型,然后再进行运算,结果的数据类型和级别高的操作数相同。

           高        double    ←←    float
           ↑          ↑             
           ↑         long     
           ↑          ↑
           ↑        unsigned
           ↑          ↑
           低         int
          ←←    char,short

                 自动转换顺序表

  3. 函数返回值的类型转换: int f1(){ return 36.8;}

    强制类型转换运算符
    可以利用强制类型转换运算符将一个表达式转换成所需类型:
    例如:
  (double)a       (将a转换成double类型)
     (int)(x+y)      (将x+y的值转换成整型)
     (float)(5%3)    (将5%3的值转换成float型)
     (int)(1.5+2.3) = ?  
      (int)1.5+2.3=? 
    注意,表达式应该用括号括起来。如果写成(int)x+y 则只将x转换成整型,然后与y相加。

    对于从高到低的强制转换,实质上就是一个截断的操作,只把低端需要的部分保留,其余的部分直接扔掉了。


    混合运算

 混合运算是指在一个表达式中参与运算的对象不是相同的数据类型,例如:
  2*3.1416*r 3.1416*r*r 3.6*a%5/(*b)+'f';
 如果r为int型变量,a为float型变量,b为double型变量,则以上三个表达式中涉及到的数据类型有整型、实型、字符型,这种表达式称为混合类型表达式。对混合类型表达式的求解要进行混合运算,此时首要的问题是对参与运算的数据进行类型转换。

下面给出类型转换的示例,以加深理解。设有如下变量说明:
  int a, j, y; float b; long d; double c;
  则对赋值语句:
  y=j+'a'+a*b-c/d;
  其运算次序和隐含的类型转换如下:
  ① 计算a*b,由于变量b为float型,所以运算时先由系统自动转换为double型,变量a为int型,两个运算对象要保持类型一致,变量a也要转换为double,运算结果为double型。
  ② 由于c为double型,将 d 转换成 double 型,再计算 c/d,结果为double型。
  ③ 计算j+'a',先将'a'(char型)转换成整型数再与j相加,结果为整型。
  ④ 将第1步和第3步的结果相加,先将第3步的结果(int)转换成double型再进行运算,结果为double型。
  ⑤ 用第4步的结果减第2步的结果,结果为double型。
  ⑥ 给y赋值,先将第5步的结果double型转换为整型(因为赋值运算左边变量y为整型),即将double型数据的小数部分截掉,压缩成int型,然后进行赋值。
  以上步骤中的类型转换都是C语言编译系统自动完成的。

转自:http://blog.csdn.net/colin719/article/details/650958

posted on 2012-09-21 20:52  Fiyang  阅读(588)  评论(0)    收藏  举报