打印
[51单片机]

32位16进制浮点数转换为10进制

[复制链接]
楼主: guanyumou
手机看帖
扫描二维码
随时随地手机跟帖
21
guanyumou|  楼主 | 2014-11-20 15:55 | 只看该作者 回帖奖励 |倒序浏览
ningling_21 发表于 2014-11-20 15:34
方法对,顺序反了

char_val[0]=0x43;

从本论坛拷贝来一个例子,好像也是您回答的:

union{
  float f;
  char  buf[4];
}data;
data.buf[0] = 0x6b;
data.buf[1] = 0x28;
data.buf[2] = 0x1D;
data.buf[3] = 0x44;

data.f;  // 这个data.f就是你要的628.6315

是这样的吗?
是不是这个data.f本身还带符号位呢?

使用特权

评论回复
22
guanyumou|  楼主 | 2014-11-20 15:56 | 只看该作者
ningling_21 发表于 2014-11-20 15:55
注意大小端的问题,我是这样用的,你可以两种都试试就知道了

您说的大小端是什么意思,不太理解!请指教!

使用特权

评论回复
23
ningling_21| | 2014-11-20 15:57 | 只看该作者
guanyumou 发表于 2014-11-20 15:55
从本论坛拷贝来一个例子,好像也是您回答的:

union{

浮点数本身就带符号位,就是 char 的最高字节的最高位

使用特权

评论回复
24
guanyumou|  楼主 | 2014-11-20 16:16 | 只看该作者
ningling_21 发表于 2014-11-20 15:57
浮点数本身就带符号位,就是 char 的最高字节的最高位

union{
  float f;
  char  buf[4];
}data;
data.buf[0] = 0x6b;
data.buf[1] = 0x28;
data.buf[2] = 0x1D;
data.buf[3] = 0x44;

data.f;  // 这个data.f就是你要的628.6315

我手动算过,0x44这个的最高位是浮点数的符号位,而0x6b的最高位不是!0x44是整个4个字节数据的最高的字节!
============================================================
是不是data.buf[3]这里应该保存的是带有浮点数符号位的那个字节呢?

因为我假设的43FA0000
43这个字节数据的最高位才是浮点数的符号位 而不是00

那么是不是应该是:

union{
  float f;
  char  buf[4];
}data;
data.buf[0] = 0x00;
data.buf[1] = 0x00;
data.buf[2] = 0xFA;
data.buf[3] = 0x43;

data.f;  // 这个data.f就是你要的500.00

使用特权

评论回复
25
ningling_21| | 2014-11-20 16:18 | 只看该作者
guanyumou 发表于 2014-11-20 16:16
union{
  float f;
  char  buf[4];

这个需要仿真调试,或模拟调试 一看就知道了

使用特权

评论回复
26
guanyumou|  楼主 | 2014-11-20 16:24 | 只看该作者
ningling_21 发表于 2014-11-20 16:18
这个需要仿真调试,或模拟调试 一看就知道了

传感器手册告诉我的说是
返回给单片机4个字节的数据,第二个寄存器的高8位的最高位是符号位
他还举例说明了,比如数据43FA0000实际就是500.00
所以我想确认的一点就是如果我这个可以确定43的最高位是符号位,且43是高16位的高8位、FA是高16位的低8位、00是低16位的高8位、00是低16位的低8位的话,那么,如下是否有错???
========================================================================
union{
  float f;
  char  buf[4];
}data;
data.buf[0] = 0x00;
data.buf[1] = 0x00;
data.buf[2] = 0xFA;
data.buf[3] = 0x43;

data.f;  // 这个data.f就是你要的500.00

使用特权

评论回复
27
guanyumou|  楼主 | 2014-11-20 16:29 | 只看该作者
ningling_21 发表于 2014-11-20 16:18
这个需要仿真调试,或模拟调试 一看就知道了

再麻烦你一下:
本论坛看到一个技术总监的回复:

浮点数道理与正负数道理一样的

比如

char a = -1;

这个A等于负一,但如果强行当成无符号数就是0xff

同理浮点数628.6315,强行当成无符号数就是0x6b281d44

这里的强行是从内存的角度看的意思

=====================================================
我不明白的是浮点数628.6315强行当成无符号数,我理解应该是0x441d286b啊!

然后反过来0x441d286b转换为浮点数就是628.6315啊

对了,我用的环境是kill 4的环境!

究竟哪个对啊???急切啊!

使用特权

评论回复
28
ningling_21| | 2014-11-20 17:22 | 只看该作者
0x441d286b转换为浮点数就是628.6315  

反过来也是

使用特权

评论回复
29
QuakeGod| | 2014-11-20 21:52 | 只看该作者
:L
楼上一大堆人在这里瞎嚷嚷。
首先,内存里面没有16进制,只有2进制,16进制是人为规定的。
另外,如果要显示出来,首先要变成字符或者字符串。
程序就是,
char buf[10]
sprintf(buf,"%4f.2",f*100.0);
buf[3]中就是个位,buf[5],buf[6]中是小数位。
当然,里面都是ASCII码,如果要在LED中显示出来,需要转码,变成段码。

使用特权

评论回复
30
zyj9490| | 2014-11-20 22:36 | 只看该作者
ayb_ice 发表于 2014-11-20 15:06
本身是浮点数,赋值给浮点数当然还是浮点数了(但要注意大小端的问题)

正负值就简单了,判断正负后就可 ...

IEEE754有大小端之分吗?我还是第一次看到。

使用特权

评论回复
31
ayb_ice| | 2014-11-21 07:58 | 只看该作者
zyj9490 发表于 2014-11-20 22:36
IEEE754有大小端之分吗?我还是第一次看到。

浮点数本身没有大小端

但存在内存里就有区别了

使用特权

评论回复
32
ayb_ice| | 2014-11-21 08:04 | 只看该作者
guanyumou 发表于 2014-11-20 16:29
再麻烦你一下:
本论坛看到一个技术总监的回复:

浮点数的强制转换是不同的,

如果将浮点数转换成无符号数其实就是将浮点数转换成整形,再将整形转换成无符号

你说的那个需要下面这样
F32 t = 3.14;
U32 k;
k = ((U32*)&t)[0];

使用特权

评论回复
33
zyj9490| | 2014-11-21 08:34 | 只看该作者
ayb_ice 发表于 2014-11-21 07:58
浮点数本身没有大小端

但存在内存里就有区别了

我实际试下,确实是一样。

使用特权

评论回复
34
ayb_ice| | 2014-11-21 08:38 | 只看该作者
zyj9490 发表于 2014-11-21 08:34
我实际试下,确实是一样。

都不明白你在说什么

使用特权

评论回复
35
mcu5i51| | 2014-11-21 09:20 | 只看该作者
按照高低顺序重新组合就好了,现在的编译器多能处理

使用特权

评论回复
36
coody| | 2014-11-21 10:47 | 只看该作者
guanyumou 发表于 2014-11-20 14:13
你好,这样做恐怕不对吧?!读过来的是4个字节的IEEE754国际标准的16进制数据哦!是不是先得转换呢? ...

十几年来在工控上MODBUS-RTU协议,我一直使用这个方法处理浮点数显示,简单可靠快捷,你都没测试过,凭什么说不行?

很多时候都不想回复,因为很多时候回复都是当空气。

使用特权

评论回复
37
zyj9490| | 2014-11-21 12:44 | 只看该作者
ayb_ice 发表于 2014-11-21 08:38
都不明白你在说什么

51跟ARM 的存储方式有差,次序正好倒的,可能754标准只规定高字节到低字节的排序,而不是低地址到高地址的字节的排序。

使用特权

评论回复
38
ayb_ice| | 2014-11-21 13:49 | 只看该作者
zyj9490 发表于 2014-11-21 12:44
51跟ARM 的存储方式有差,次序正好倒的,可能754标准只规定高字节到低字节的排序,而不是低地址到高地址 ...

谁说51和ARM就一定相反的

这个既取决于编译器,也取决于内核

使用特权

评论回复
评论
zyj9490 2014-11-21 16:40 回复TA
ARM一般是小端模式,没有专门设定的话。 
39
guanyumou|  楼主 | 2014-11-21 14:04 | 只看该作者
coody 发表于 2014-11-21 10:47
十几年来在工控上MODBUS-RTU协议,我一直使用这个方法处理浮点数显示,简单可靠快捷,你都没测试过,凭什 ...

您误会了
这个单片机接收过来的数据,举例比如是16#43FA0000,手册上告诉我的是符合IEEE754标准的浮点数,实际就是500.00,然后我的目的就是要在数码管上显示500.00,就想实现这个目的!

使用特权

评论回复
40
guanyumou|  楼主 | 2014-11-21 14:39 | 只看该作者
QuakeGod 发表于 2014-11-20 21:52
楼上一大堆人在这里瞎嚷嚷。
首先,内存里面没有16进制,只有2进制,16进制是人为规定的。
另外,如果要 ...

你好,再麻烦你
假如我接收过来的数据是16进制32位的43FA0000,然后告诉我的是这个实际上就是500.00,
我最终目的要把500.00显示到数码管上
================================================================================
程序就是,
char buf[10]
sprintf(buf,"%4f.2",f*100.0);
buf[3]中就是个位,buf[5],buf[6]中是小数位。
当然,里面都是ASCII码,如果要在LED中显示出来,需要转码,变成段码。
============================================================================
您这个程序执行后,buf数组里是不是依次保存的是500.00的各个位权的ASCII码?

您试过吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则