快捷搜索: 王者荣耀 脱发

C语言实现浮点数大小端转化

操作了一天,终于实现了浮点数的大小端转化。通过VS内存查看对应的二进制存储,发现终于改变了。之前因为类型的转化不当,总是输出不了正确的结果,一定要注意不要发生类型转化。我用了26.5做实验,原本41 d4 00 00转化为了00 00 d4 41,输出可能为零,但是内存中的表示确实已经发生了改变。 主要的原理是union这个共同体的功劳。因为int、float都是4个字节,也不会存在存取位置的不同。转化起来简直不要太爽。就相当于一样的东西,int拿出来就是int型,float拿出来就是float型。 主要参考了这篇博文,做了一定的修改,并验证。

#include <netinet/in.h>
#include<stdio.h>
union intWithFloat
{
    int m_i32;
    float m_f32;
};
int swapInt32(int value)
{
    return ((value & 0x000000FF) << 24) |
        ((value & 0x0000FF00) << 8) |
        ((value & 0x00FF0000) >> 8) |
        ((value & 0xFF000000) >> 24);
}
/*
float swapFloat32(float value)
{
    union intWithFloat i;
    i.m_i32 = value;
    printf("%d
", i.m_i32);
    //i.m_f32 = swapInt32(i.m_i32);  
    i.m_f32 = ntohl(i.m_i32);//这个函数可以用,不过有的编译器导入不了
    return i.m_f32;
}*/
float swapFloat32_22(float value)
{
    union intWithFloat i;
    i.m_f32 = value;//因为输入的是float类型,用float接受不会改变数值
    float *pf = NULL;
    int *pi = NULL;
    pf = &i.m_f32;
    pi = &i.m_i32;
    i.m_i32 = swapInt32(i.m_i32);//用int型接受不会改变数值

    return i.m_f32;
}

int main()
{
    float a = 26.5;
    float b=0;
    float c=0;
//  b = swapFloat32(a);
    c = swapFloat32_22(a);
    float *q = &c;
//  printf("%f
", b);
    printf("%f", c);
    return 0;
}

m_f32和m_i32的内存地址指向同一处: 查看内存中的二进制表示 调用swapInt32函数后该内存的数值发生改变

经验分享 程序员 微信小程序 职场和发展