C语言数据类型转换规则(隐式转换+显式转换)

赋值过程中的类型转换

如果赋值运算符两侧的类型不一致,但都是基本类型时,在赋值时要进行类型转换。类型转换是由系统自动进行的,转换的规则是:

  1. 将浮点型数据(包括单、双精度)赋给整型变量时,先对浮点数取整,即舍弃小数部分,然后赋予整型变量。
  2. 将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中。
  3. 将一个double型数据赋给float变量时,先将双精度数转为单精度,即只取6~7位有效数字,存储到float型变量的4个字节中。应注意双精度数值的大小不能超出float型变量的数值范围。
  4. 字符型数据赋给整型变量时,将字符的ASCII码值赋给整型变量。
  5. 将一个占字节多的整型数据赋给一个占字节少的整型变量或字符型变量(例如把占4个字节的int型数据赋给占2个字节的short变量或占1个字节的char变量)时,只将其低字节原封不动地送到被赋值的变量(即发生截断)。

——《C程序设计(第五版)》61页


隐式类型转换

  1. 当出现在表达式中,有符号和无符号的 char 和 short 会被自动转成 int 参与运算。当 short 与 int 大小一样的时候,unsigned short 会被转成 unsigned int。
  2. 在包含两种数据类型的任何运算里,两个值都被转换成两种类型中级别较高的类型(称为“提升”),然后再参与计算,只有同类型的数据才能直接运算。
    1. 类型级别高到低的顺序为:long double 、double、float、unsigned long long、long long、 usinged long、long、unsigned int、int。
    2. 当 long 和 int 有相同大小时,此时 unsigned int 比 long 的级别更高。之所以没有涉及到 char 和 short ,是因为它们已经被提升到 int 或者 unsigned int。
    3. 实例演示
3 + 4 / 5.0f + 6 - 9.0(double)
根据运算符优先级,先计算 4 / 5.0f, 所以先把 4 转换成 float 4.0f 计算结果为 0.8f

3 + 0.8f + 6 - 9.0
然后根据由左向右的顺序:
先算 3 + 0.8f, 3 转换成 3.0f 计算结果为 3.8f
再计算3.8f + 6, 6 转换为 6.0f 计算结果为 9.8f

9.8f - 9.0
9.8f 转换为 double 9.8 计算结果为 18.8(double)
        
并不是一开始就全部转换成double        
  1. 在赋值语句中,计算的最后结果都会被转换成赋值运算符左侧那个变量的类型,这个过程可能升级,也可能降级,降级是将一个值转换成一个更低级的类型。
int a = 2022.22; // double转int,降级
double b = 22;   // int转double,升级
  1. 当作为函数的参数被传递时,char和short会被自动转成int,float会被转成double,可通过函数原型来防止提升。
  2. 提升通常是一个平滑无损的过程,但降级可能会导致“截断”。

——《C Primer Plus(第五版)》105页


显式类型转换(强制类型转换)

形式:(type)数据/表达式

22 + 22.22      //隐式转换,结果是double型
22 + (int)11.11 //会先把11.11转换成11再和22相加,结果是int型

你可能感兴趣的:(C/C++,c语言)