注册 登录
编程论坛 C语言论坛

三个字节的16进制数转成浮点数是多少?

yangguang226 发布于 2019-08-08 11:37, 3270 次点击
如题

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

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

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

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

求这三个字节 转换成 十进制浮点为多少?
9 回复
#2
yangguang2262019-08-08 11:47
请路过的各位指教一下,我现在急着解决的。
#3
wmf20142019-08-08 11:54
0000 1010 1 1111 1001 1100 0000=(BIN)1 1111 1001 11.00 0000=(DEC)2023.0
大概是这样。
#4
yangguang2262019-08-08 14:07
回复 3楼 wmf2014
您好,好像不是这样的。
0AF9C0换算成十进制,应该是999。
#5
wmf20142019-08-08 15:44
那我尝试着转换为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编辑过]

#6
yangguang2262019-08-08 15:59
回复 5楼 wmf2014
你好,你这是算的四字节的浮点数。我这是三字节的。
#7
wmf20142019-08-08 16:17
回复 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编辑过]

#8
吹水佬2019-08-08 17:26
我算的是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);
}
#9
吹水佬2019-08-08 17:30
回复 8楼 吹水佬
当整数处理了
#10
吹水佬2019-08-08 20:12
是不是这样理解:
    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编辑过]

1