15-单片机模块化程序: IEEE754规约,浮点数和16进制之间的转换

资料源码:https://gitee.com/yang456/OpenProgrammingModuleForMCU.git

点击加入群聊【单片机,物联网,上位机】:ESP8266开发交流群

说明1:知识从未如此性感。 烂程序员关心的是代码,好程序员关心的是数据结构和它们之间的关系!

说明2:学的是思想,而非程序!此代码思路适用于所有的单片机。

说明3:学会以后,下面的代码可能会跟你一辈子!

说明4:这一系列文章是为大幅度裁剪本人博客文章!使博客文章更有条理。便于推其它教程!

 

前言

  现在很多通信都需要传输各种数据,所有的仪器仪表都是把数据转化为16进制以后传输

  为了使转换通用,所以才有了 IEEE754规约

 

直接上菜

  

typedef union Resolve
{
  float float_data;
  long long_data;
  char char_table[4];
}Resolve_Typedef;

 

 

 

 

 

 

 

 

 

 

 

254 转为16进制

  

 

 

  

 

 

  注意:我使用的是STM32,它储存数据的时候低位在前高位在后

 

  咱比较喜欢这样看数据 00 00 00 FE  这就是254

 

 

65536 转为16进制

  

 

 

  

 

 

  00 01 00 00  这就是65536的16进制表示

 

 

说明

  大家有没有疑问为什么写的是转化为4字节

  

 

 

  大家如果做仪器仪表通信做久了就会发现几乎都是转换为4字节

 

  只不过在传输的时候有的仪器仪表是先传输高位

 

  就像咱上面的 65536  16进制是   00 01 00 00

 

  有极少数的仪器仪表先传输低位  00 00 01 00

 

 

 

 

220.5 转为16进制

  

 

 

  

 

 

有16进制浮点数数据了,转为浮点数

  假设数据是 00 80 5C 43 

  

 

 

  

 

 

 

扩展 C# 实现

65536 转为16进制

   byte[] byt = BitConverter.GetBytes(65536);//转为byt,默认就是转成4字节

  转换之后  

  byt[0] = 0x00;

  byt[1] = 0x00;

  byt[2] = 0x01;

  byt[3] = 0x00;

 

  byt[0] 存储的是最低位,和上面的单片机一样

  如果通信规定先传输高位,00 01 00 00 那么传输的时候

  byt[3],byt[2],byt[1],byt[0]      

 

 

 

220.5 转为16进制

//和咱单片机定义联合体解析一样的道理
//转为byt,默认就是转成4字节
byte[] byt = BitConverter.GetBytes(220.5f);

转换之后:

byt[0] = 0x00;
byt[1] = 0x80;
byt[2] = 0x5c;
byt[3] = 0x43;

 

 

注意:220.5f  后面需要加f

否则会按照double数据类型进行转换

按照 double 进行转换的,转换出来是8字节

byt[0] = 0x00;

byt[1] = 0x00;

byt[2] = 0x00;

byt[3] = 0x00;

byt[4] = 0x00;
byt[5] = 0x90;
byt[6] = 0x6B;
byt[7] = 0x40;

 

有16进制整形数据了,转为整形数据

  假设数据是65536    : 00 01 00 00

  

  byte[] byteValue = new byte[4];

  byteValue[3] = 0x00;
  byteValue[2] = 0x01;
  byteValue[1] = 0x00;
  byteValue[0] = 0x00;


  int intValue = BitConverter.ToInt32(byteValue,0);

 

  intValue 就是 65536

  注意

  

 

 

  倒过来填写的

 

  因为C#默认是低位放到低位,高位放到高位(小端模式)

 

 

有16进制浮点数数据了,转为浮点数

  假设数据是 220.5     :43 5C 80 00

  

  byte[] byteValue = new byte[4];

  byteValue[0] = 0x43;
  byteValue[1] = 0x5c;
  byteValue[2] = 0x80;
  byteValue[3] = 0x00;


  float floatValue = BitConverter.ToSingle(byteValue, 0);

 

  floatValue计算出来就是 220.5

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在C语言中,可以通过使用联合体的方式将IEEE 754浮点数16进制数互相转换。 首先,我们可以定义一个联合体,其中包含两个不同的成员变量:一个是带符号整型的16进制数表示,另一个是单精度浮点数IEEE 754表示。 ```c union FloatHex { float f; int hex; }; ``` 接下来,我们可以编写两个函数来进行转换。第一个函数用于将IEEE 754浮点数转换16进制数: ```c int floatToHex(float f) { union FloatHex fh; fh.f = f; return fh.hex; } ``` 第二个函数用于将16进制转换IEEE 754浮点数: ```c float hexToFloat(int hex) { union FloatHex fh; fh.hex = hex; return fh.f; } ``` 使用以上两个函数,我们可以在程序中进行相互转换: ```c #include <stdio.h> union FloatHex { float f; int hex; }; int floatToHex(float f) { union FloatHex fh; fh.f = f; return fh.hex; } float hexToFloat(int hex) { union FloatHex fh; fh.hex = hex; return fh.f; } int main() { float f = 3.1415926; int hex = floatToHex(f); printf("浮点数 %.6f 转换16进制数为 0x%x\n", f, hex); float f2 = hexToFloat(hex); printf("16进制数 0x%x 转换浮点数为 %.6f\n", hex, f2); return 0; } ``` 以上代码将浮点数3.1415926转换16进制数,并再次将16进制转换浮点数,然后输出结果。 注意,IEEE 754浮点数的精度是有限的,并且在进行浮点数的相互转换时可能会存在舍入误差。 ### 回答2: 在C语言中,IEEE 754浮点数16进制之间的互相转换可以通过以下方式实现: 1. IEEE 754浮点数转换16进制数: 首先,我们需要使用一个union类型,其中包含一个浮点数类型的成员和一个整数类型的成员,如下所示: ```c typedef union { float f; // 浮点数类型成员 int i; // 整数类型成员 } FtoI; ``` 然后,我们可以通过将浮点数赋值给FtoI的浮点数成员,将浮点数转换为对应的整数: ```c float num = 3.14; // 假设要转换浮点数为3.14 FtoI converter; converter.f = num; int hex = converter.i; printf("%X\n", hex); // 输出转换后的16进制数 ``` 2. 16进制转换IEEE 754浮点数: 首先,我们需要获取16进制数的整数值,并将其赋值给FtoI的整数成员: ```c char hexStr[] = "4048F5C3"; // 假设要转换16进制数为4048F5C3 FtoI converter; sscanf(hexStr, "%X", &(converter.i)); // 将16进制转换为对应的整数 ``` 然后,我们可以通过取得FtoI的浮点数成员的值来获得对应的IEEE 754浮点数: ```c float num = converter.f; printf("%f\n", num); // 输出转换后的浮点数 ``` 通过以上方法,我们可以在C语言中实现IEEE 754浮点数16进制数的互相转换。 ### 回答3: IEEE 754浮点数是一种用于表示浮点数的二进制格式,而16进制数是一种整数表示法。在C语言中,我们可以使用联合体(union)或者指针来实现IEEE 754浮点数16进制数的互相转换。 方法一:使用联合体(union) 首先,定义一个联合体,它包含一个32位整数类型的成员和一个单精度浮点数类型的成员: ```c union Number { int i; float f; }; ``` 接下来,我们可以将IEEE 754浮点数转换16进制数,或者将16进制转换IEEE 754浮点数,通过访问联合体的不同成员来实现。例如,将一个IEEE 754浮点数表示为16进制数: ```c union Number num; num.f = 3.14; printf("%X\n", num.i); ``` 这样就可以将浮点数3.14表示为16进制数的形式。 反过来,将16进制转换IEEE 754浮点数也可以通过该联合体实现: ```c union Number num; num.i = 0x4048F5C3; printf("%f\n", num.f); ``` 这样就可以将16进制数0x4048F5C3转换为对应的浮点数。 方法二:使用指针 在C语言中,可以使用指针来访问内存中的表示浮点数的二进制数据。我们可以将一个float型的指针转换为一个unsigned int型的指针,然后通过打印指针所指向的内存地址中的二进制数来获得浮点数的二进制表示。例如,将浮点数3.14表示为16进制数: ```c float f = 3.14; unsigned int* p = (unsigned int*)&f; printf("%X\n", *p); ``` 这样便可以将浮点数3.14的二进制表示为16进制数。 反过来,将16进制转换IEEE 754浮点数,也可以使用指针来进行操作: ```c unsigned int hex = 0x4048F5C3; float* pf = (float*)&hex; printf("%f\n", *pf); ``` 这样就可以将16进制数0x4048F5C3转换为对应的浮点数。 总结起来,通过联合体或者指针的方式,我们可以在C语言中实现IEEE 754浮点数16进制数的互相转换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值