关于数据类型转化的问题

问题遇到的现象和发生背景

期中考试原题:“已知C语言变量定义char c, float f; 函数原型void fun(int); 当执行函数调用fun(c+f)时,发生了哪些数据类型转换?该调用可能存在什么问题?”得了一半分

遇到的现象和发生背景,请写出第一个错误信息

我的回答:“由于函数要求形参和实参是int整型,因此char c作为单个字符会被转化为int整形,float f则会被强制转化为int整型。
出现的问题:float强制转化为int会丢失精度,float会取整为int导致不准确。”

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
运行结果及详细报错内容
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

我知道对于c+f,char会先转化成int然后再变为float,但此时float进入int型形参的函数里的类型转化就不清楚;然后类型转化可能存在的问题也不清楚。
可能c+f的转化我的答案没写出来,只写了调用函数丢失精度,所以扣分了也是有可能的。

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

希望能讲解一下1)这个例子类型转化一共有哪些步骤,2)然后调用fun有啥问题。

应该是c+f先执行,c会先转换为float类型,c+f的结果为float类型,然后将float传递给int,会进行float转换为int
所以你的回答在这点上是有问题的

查了一下C语言中的类型转换规则,如下:
1.如果两种类型字节数不同,则转换成字节数高的类型。
2.如果两种类型字节数相同,但一种有符号,一种无符号,则转换成无符号类型
3.所有浮点都是以双精度类型进行的,即使只含有单精度运算的表达式,也要先转换成double型,再作运算。
所以,转换过程是:C转换为float,然后c和 f 转为double类型进行计算,然后再把double类型转为int类型传入函数。

存在的问题:float存在精度问题,在不同的编译器中实际存储的值存在差异,比如,float f = 3;在一部分编译器中存储的是2.9999999,在一部分编译器中则是3.00000001,所以在float转int的过程中,可能出现不同的结果(即可能是向上取整,也可能是向下取整)。