最近在工作中遇到了一个情况:公司产品中上位机和下位机有时需要传递float型变量。但是公司原有的协议制定起来的很繁琐。float变量在内存中占4个字节,而这个协议用两个字节来定义整数,用两个字节来定义小数,同时还要根据数据正负来定义首位的值。不管是上位机还是下位机在接到数据后,想要使用都要通过一系列的运算,虽然函数写一次以后用就行了,但个人感觉还是挺麻烦的。尤其是要面向新的客户时,要向客户去解释这个操作,都会有点费劲。
印象中在刚工作的那几年,有一次也用到了float型转4个字符型变量,但是没什么记忆。正好趁现在上网上搜索了一下,看看大家都是如何处理的。总结了一下,貌似是两种,一种是根据float型变量的定义方法,去计算不同的。还有一种是利用共同体(union)去进行转换。第一种我觉的看起来就比较繁琐,我个人倾向于第二种。
第二种利用的原理很简单,定义一个共同体,共同体的成员分别定义一个float变量,1个4成员的unsigned char数组,由于共同体中的成员占用共同的一段内存。所以当你对float型赋值后,直接取unsigned char数组的值,其实就相当于完成了转化,这是个很巧妙的方法。我用编辑器测试了一下,也是可行的。
#include <stdio.h>
#include <stdlib.h>
float sample=1.234;
union
{
unsigned char Byte[4];
float a;
}FloatTo4Bytes;
int main()
{
char i=0;
FloatTo4Bytes.a=sample;
for(i=0;i<4;i++)
{
printf("Byte%d=0X%X\r\n",i+1,FloatTo4Bytes.Byte[i]);
}
return 0;
}
转换结果如下
可以看到,其实很简单的就完成了转换。整个过程也不复杂。其实工作中经常需要对float型变量也就是小数进行传输,都按照这个方法大家都比较省事。至于是不是有其他我还没考虑到的问题,这个等以后吧,如果遇到了,再来说一说……