如何将int数组(以十六进制保存浮点值)转换回C中的浮点值

时间:2016-03-30 02:54:31

标签: c arrays

我正在尝试编写一个自动化测试程序,要求我生成一个int数组数据流(实际上保存浮点数据)

要生成该int数组,我尝试

  1. 将浮点数写入char字节数组,然后

  2. 将char字节数组转换为int数组,稍后

  3. 将int数组中的数字转换回浮点数(不丢失小数点)。

  4. 我能够做第1步& 2没有问题,但我无法使用(float)(* int_ptr)将int数组转换回浮点数。

    我的代码:

    int ibuff[10];
    
    int *int_ptr;
    
    float f=0.1;
    
    char c [sizeof(float)];
    
    
    memcpy(c, &f, sizeof(float)); //now c is 0x3f800000;  
    
    ibuff[0]=(c[3]<<24 | c[2]<<16 | c[1]<<8 | c[0]);  //ibuff[0] is now also 0x3f800000
    
    int_ptr=&ibuff[0];
    
    printf("%f\n", (float)(*int_ptr)); //this will print out 1065353216.0000, and not 1.0 as I expected
    

2 个答案:

答案 0 :(得分:0)

在您的打印声明中:

(float)(*int_ptr)

您正在将一个int转换为float,即(float)(int)(x)x的值作为float而不是int。你想要的是作为一个浮点数进行交互的位置的记忆,所以你需要:

*(float *)(int_ptr)

答案 1 :(得分:0)

您的直接问题来自将解除引用的整数指针int_ptr转换为float,然后尝试将该值打印为float。您目前正在尝试:

printf("%f\n", (float)(*int_ptr));
你找到的

将无效。您要做的是将 int_ptr所占地址的值解释为float。为此,您需要:

printf("%f\n", *(float*)(int_ptr));

虽然您可以将地址视为任何类似的地址,但您必须确保不会违反C规范中规定的严格别名规则6.5 (6)6.5 (7)。指定了有限的例外,但如上所述:&#34;意图......是指定对象可能或可能没有别名的情况。&#34; 从技术上讲,你的演员来自intfloat是一种违规行为,它被一个指针所掩盖(通过干预使用一个字符阵列来达到这一点,这使得水更加混乱)。