C语言中不同变量类型之间的运算与不同常量类型之间运算的分析

不同的数据类型转换分为自动转换和强制转换,此文只讨论自动转换的情形;

C语言中float类型安排4个字节,double类型安排8个字节,int类型为四个字节。在一次调试中博主发现这样的情形;

C语言中不同变量类型之间的运算与不同常量类型之间运算的分析sizeof为c语言中的一个关键字(也被称为单目运算符),用于判断数据长度;

上面这个情况可以用一句话来解释——C编译系统把浮点型常量都按双精度处理,分配八个字节;

但是在学习过程中这里存在一个坑。参考教材《C程序设计(第五版)》中不同类型数据间的混合运算有以下规则:

1. +. -. *. /运算的两个数中有一个数为float或double型,结果是double型,因为系统将所有float型数据都先转换为double型,然后进行运算;

2. 若int型与float或double型数据进行运算,先将int型和float型转换为double型,然后进行运算,结果为double型;

那么第一个printf输出a*b是int类型数据与float类型数据相乘,遵循以上规律结果应该为double型,然而实际上为4个字节为float型;

跟第二个printf用常数表达式对比易知,变量表达式与常量表达式在数据类型不同时转换的过程也不相同;

首先我们讨论为什么C编译系统把浮点型常量都按双精度处理,分配八个字节。float的有效数字为6-7位,double15-16位,如果出现以下表达式8888*4.58746=40 773.34448,两数相乘可以拿float和int型装载,但如果结果也拿float类型去装载将会造成精度丢失;所以不同类型常量之间的运算中有一个数为float型,运算过程中会直接转化成double型,结果也为double型;

    float b = 1.1;
    printf("%f", b);//C4305    “初始化”: 从“double”到“float”截断

而已经确定好类型的变量之间不同类型的运算是根据谁的精度高结果就属于哪个类型(除char→int等特殊情况),所以float*float=float,float*double=double,int*float=float而不会出现类似上述规律中的第二点的情况;

博主对这一现象困惑了许久,上百度查阅相关论文后无解后分析出了这种现象,欢迎纠错补充。

参考: [1]王影.浅谈C语言中不同数据类型之间的转换[J].才智,2008(23):46;C程序设计(第五版)主编:谭浩强