MST

星途 面试题库

面试题:C语言联合体在复杂数据类型转换场景下的运用

假设有一个联合体定义如下:union data { int num; float f; char str[4]; }; 现有一个函数需要接收不同类型的数据,通过这个联合体来实现数据类型转换和传递。编写一个函数,它可以接收一个整数或者浮点数,然后将其转换为另外一种类型并返回结果。同时,说明在这种情况下可能出现的数据精度丢失问题及如何避免。
34.4万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

union data { 
    int num; 
    float f; 
    char str[4]; 
};

union data convert(union data input) {
    union data result;
    if (*(char*)&input.num != 0) {  // 判断是整数输入
        result.f = (float)input.num;
    } else {
        result.num = (int)input.f;
    }
    return result;
}

int main() {
    union data input, output;
    input.num = 10;
    output = convert(input);
    printf("将整数 %d 转换为浮点数: %f\n", input.num, output.f);

    input.f = 3.14f;
    output = convert(input);
    printf("将浮点数 %f 转换为整数: %d\n", input.f, output.num);

    return 0;
}

数据精度丢失问题及避免方法

  1. 浮点数转整数
    • 问题:当浮点数转换为整数时,小数部分会被直接截断,导致精度丢失。例如,3.14转换为整数后变为3,0.14的小数部分丢失。
    • 避免方法:在转换前,根据需求对浮点数进行四舍五入或其他合适的取整操作。例如,要实现四舍五入,可以使用 result.num = (int)(input.f + 0.5)
  2. 整数转浮点数
    • 问题:通常情况下,整数转浮点数不会丢失精度,因为浮点数能够表示更大范围和精度的数值。但是,如果整数非常大,超过了浮点数的有效数字范围,可能会出现精度丢失。例如,一个非常大的整数转换为浮点数后,部分低位数字可能无法精确表示。
    • 避免方法:如果要确保高精度,可以考虑使用更高精度的浮点数类型(如 double 甚至 long double),不过这也有其表示范围和精度限制。在实际应用中,要根据具体需求和数据范围来选择合适的数据类型,以避免可能的精度问题。