十六进制与浮点数的互相转换

十六进制与浮点数的互相转换十六进制与浮点数的互相转换第一部分 关于 16 进制浮点数对于大小为 32 bit 的浮点数 32 bit 为单精度 64 bit 浮点数为双精度 80 bit 为扩展精度浮点数 1 其第 31bit 为符

大家好,欢迎来到IT知识分享网。

十六进制与浮点数的互相转换

第一部分:

以上内容为IEEE的标准,现在有个问题,假设我有两台设备在通讯,一个设备向另外一个设备发送数据,这个数据是浮点数,那么我怎么来发送这个数据呢?怎么让接受方知道发送来的是个浮点数呢?而且发送数据要尽量短,最好还要固定长度,也许有人会怎么做:A发送数据3.7586给B,A先将这个浮点数乘以10000变成整型37586,然后将这个整数发送给B,这样使用的弊端是:1、B要事先知道A将这个数字放大了多少倍。2、A需要做一次浮点数的乘法运算,而B要做一次浮点数的除法运算,这对于单片机来说是个负担。3、这样使用会多占用发送数据。因为事先没人知道这个浮点数到底多大。

此时A就可以将这个数字发送给B了,B接收到的是4个字节表示的一个浮点数,但需要经过如下转换使用:

好了,此时的B已经得到了一个浮点数fReceive;

第二部分

#include <stdio.h> unsigned char pData[4]={ 
   0x66,0xE6,0xF0,0x42}; unsigned char buf[4]; float num; float Char2Float(unsigned char *chReceive) { 
    float fReceive; *((char *)(&fReceive)) = chReceive[0]; *((char *)(&fReceive) + 1) = chReceive[1]; *((char *)(&fReceive) + 2) = chReceive[2]; *((char *)(&fReceive) + 3) = chReceive[3]; return fReceive; } void Float2Char (float fSend, unsigned char *chSend) { 
    chSend[0] = *((char *)(&fSend)); chSend[1] = *((char *)(&fSend) + 1); chSend[2] = *((char *)(&fSend) + 2); chSend[3] = *((char *)(&fSend) + 3); } int main(void) { 
    char i; num = Char2Float(pData); printf("%f\r\n",num); Float2Char(num,buf); for(i=0;i<4;i++) { 
    printf("%x\r\n",buf[i]); } return 0; } 

第三部分:
更新:
说明:我是在DSP上做数据处理遇到,浮点型存储格式,转换成十进制的浮点型参与运算。

尝试用上面 第一部分,第二部分的规则和代码,在DSP平台上数据处理结果不正确。

最终通过用union与struct,问题解决了。对于这一类问题:位操作。其实每个平台的库代码里有现成的例子。那就是每个平台的库中都有寄存器的定义。就是用union与struct,即可解决。

typedef union { 
    float f_val; struct { 
    unsigned long datatail: 23; unsigned long exponent : 8; unsigned long sign : 1; } bits; } myfloat; 

在处理函数中,做赋值即可:

 val.bits.sign = data_sign; val.bits.exponent = data_exp; val.bits.datatail= data_tail; fReceive = val.f_val; //返回 fReceive 是float型 return fReceive; 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128664.html

(0)
上一篇 2025-08-29 22:20
下一篇 2025-08-29 22:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信