期中考试原题:“已知C语言变量定义char c, float f; 函数原型void fun(int); 当执行函数调用fun(c+f)时,发生了哪些数据类型转换?该调用可能存在什么问题?”得了一半分
我的回答:“由于函数要求形参和实参是int整型,因此char c作为单个字符会被转化为int整形,float f则会被强制转化为int整型。
出现的问题:float强制转化为int会丢失精度,float会取整为int导致不准确。”
我知道对于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的过程中,可能出现不同的结果(即可能是向上取整,也可能是向下取整)。