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函数后该内存的数值发生改变