浮点数与4个字节的转换

前言:

在串口、IICSPI等数据传送时基本上都是一次传送一个字节的数据,如果要传送浮点数据?

通常是将浮点数乘以一个倍数,如10100100010000等,然后将其转换为整型数据再转化为单个字节进行传送。如果这个数据是要进行显示的话,那么这样做并没有什么不好。但是如果这个数是要传输给另端进行继续计算的话,那么就要考虑另一种方法了,就是直接将浮点数据转换为4个单字节,在另一端接受完数据后再转化为浮点数据,这种方式不会造成精度的丢失,计算量也比较小。

程序源码:

[cpp]  view plain  copy
  1. #include <stdio.h>  
  2.   
  3. /* 
  4. 要点提示: 
  5. 1. float和unsigned long具有相同的数据结构长度 
  6. 2. union据类型里的数据存放在相同的物理空间 
  7. */  
  8. typedef union  
  9. {  
  10.     float fdata;  
  11.     unsigned long ldata;  
  12. }FloatLongType;  
  13.   
  14. /* 
  15. 将浮点数f转化为4个字节数据存放在byte[4]中 
  16. */  
  17. void Float_to_Byte(float f,unsigned char byte[])  
  18. {  
  19.     FloatLongType fl;  
  20.     fl.fdata=f;  
  21.     byte[0]=(unsigned char)fl.ldata;  
  22.     byte[1]=(unsigned char)(fl.ldata>>8);  
  23.     byte[2]=(unsigned char)(fl.ldata>>16);  
  24.     byte[3]=(unsigned char)(fl.ldata>>24);  
  25. }  
  26. /* 
  27. 将4个字节数据byte[4]转化为浮点数存放在*f中 
  28. */  
  29. void Byte_to_Float(float *f,unsigned char byte[])  
  30. {  
  31.     FloatLongType fl;  
  32.     fl.ldata=0;  
  33.     fl.ldata=byte[3];  
  34.     fl.ldata=(fl.ldata<<8)|byte[2];  
  35.     fl.ldata=(fl.ldata<<8)|byte[1];  
  36.     fl.ldata=(fl.ldata<<8)|byte[0];  
  37.     *f=fl.fdata;  
  38. }  
  39.   
  40. /* 
  41. 测试函数 
  42. */  
  43. int main()  
  44. {  
  45.     float f=123456.789f;  
  46.     unsigned char byte[4]={0};  
  47.   
  48.     printf("float data=%f\n",f);  
  49.     Float_to_Byte(f,byte);  
  50.     f=789.123456f;  
  51.     printf("changed float data=%f\n",f);  
  52.     Byte_to_Float(&f,byte);  
  53.     printf("float data=%f\n",f);  
  54.   
  55.     return 0;  
  56. }  

运行结果:

  • 10
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值