| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2980 人关注过本帖
标题:三个字节的16进制数转成浮点数是多少?
只看楼主 加入收藏
yangguang226
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-8-8
结帖率:0
收藏
已结贴  问题点数:20 回复次数:9 
三个字节的16进制数转成浮点数是多少?
如题

现有 三个字节 16进制 0A F9 C0

第一个字节的第7位表示浮点数的符号,第6位表示浮点数阶码的符号,其余6位表示阶码

第二个字节表示浮点数的尾数(高字节)

第三个字节表示浮点数的尾数(低字节)

求这三个字节 转换成 十进制浮点为多少?
搜索更多相关主题的帖子: 字节 进制 浮点数 多少 表示 
2019-08-08 11:37
yangguang226
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-8-8
收藏
得分:0 
请路过的各位指教一下,我现在急着解决的。
2019-08-08 11:47
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:10 
0000 1010 1 1111 1001 1100 0000=(BIN)1 1111 1001 11.00 0000=(DEC)2023.0
大概是这样。

能编个毛线衣吗?
2019-08-08 11:54
yangguang226
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-8-8
收藏
得分:0 
回复 3楼 wmf2014
您好,好像不是这样的。
0AF9C0换算成十进制,应该是999。
2019-08-08 14:07
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
那我尝试着转换为IEEE754浮点数。
31:符号位、30-23:指数位、22-0:尾数位,把6位指数位扩展为8位指数位+127,将16位尾数位扩展位23位尾数位,最后实际的二进制数据如下:
0 1000 1001 1111 1001 1100 0000 0000 000,分别对应32位16进制数据为:44 FC E0 00然后用下述代码反转换,得到的 结果就是2023.0,没有错。
#include <stdio.h>
int main()
{
    union
    {
        char a[4];
        float b;
    } a;
    a.a[0] = 0;
    a.a[1] = 0xe0;
    a.a[2] = 0xfc;
    a.a[3] = 0x44;
    printf("%f\n",a.b);
    return 0;
}
运行结果:2023.000000
现详细说明转换原理。
根据你的描述,第一个字节0A,二进制为0000 1010,说明符号位0,阶码符号位0,小数点位置为 00 1010,即第十位,转换位IEEE754的阶码为10+127=137=0x89,尾数16位再补7个0就可以转换为IEEE754格式了,所以:
   31:0
30-23:1000 1001
 22-0:1111 1001 0000 000


[此贴子已经被作者于2019-8-8 16:02编辑过]


能编个毛线衣吗?
2019-08-08 15:44
yangguang226
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-8-8
收藏
得分:0 
回复 5楼 wmf2014
你好,你这是算的四字节的浮点数。我这是三字节的。
2019-08-08 15:59
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 6楼 yangguang226
我只是做对应转换为程序可识别的浮点数,好用代码验证,如果用你的三字节说明,则是:
数据符号位:0
阶码符号位:0
   阶码:00 1010
浮点隐含位:1     //该位恒为1,不占用实际数据位
   尾数:1111 1001 1100 0000
拼合实际二进制数据为:0  0  001010  1  1111 1001 1100 0000,小数点在第10位,所以实际浮点二进制数据位:1 1111 1001 11.00 0000,由于小数点后均为0,所以这个数的二进制数为:1 1111 1001 11=0x7E7=(十进制)2023
你所说的999,缺少恒为1的隐含位,因此你的二进制浮点数应该是0.1111 1001 1100 0000*2^10,最后的数据为1111 1001 11=0x3E7=(十进制)999,这不符合浮点数表示法。

[此贴子已经被作者于2019-8-8 16:25编辑过]


能编个毛线衣吗?
2019-08-08 16:17
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:10 
我算的是83950016??
    0x0A = 0b0000 1010
    0xF9 = 0b1111 1001
    0xC0 = 0b1100 0000
    float类型: S(1bit) + E(8bit) + M(23bit)
    0b0000 0101 0000 0000 1111 1001 1100 0000 = 83950016

#include <stdio.h>
main()
{
    char s[3] = {0x0A, 0xF9, 0xC0};
    int a = ((s[0]>>6)<<31) | ((s[0]&0x3F)<<23) | ((s[1]<<8)&0xFF00) | (s[2]&0xff);
    float b = (float)a;
    printf("%f\n", b);
}
2019-08-08 17:26
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
回复 8楼 吹水佬
当整数处理了
2019-08-08 17:30
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
是不是这样理解:
    0x0A = 0b0000 1010  S符号+,E阶乘符号+,e=0x0A=10
    0xF9C0 = 0b1111 1001 1100 0000
    0x0AF9C0 = 0.1111100111000000*2^10 => 1111100111.000000 = 999.0


[此贴子已经被作者于2019-8-8 20:15编辑过]

2019-08-08 20:12
快速回复:三个字节的16进制数转成浮点数是多少?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064000 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved