如何双5.2在二进制文件中表示?

问题描述 投票:3回答:3

例如,给定的程序

FILE *f = fopen("test.txt","w");
double d = 5.2;
fwrite(&d, sizeof(typeof(d)), 1, f);
fclose(f);

当我使用XXD查看内容我得到

//binary
0000000: 11001101 11001100 11001100 11001100 11001100 11001100  ......
0000006: 00010100 01000000                                      .@
//hex
0000000: cdcc cccc cccc 1440                      .......@

但我发现How to represent FLOAT number in memory in C,它应该像

0 10000001 01001100110011001100110

所以我不知道它在内存和文件相同的二进制或我是完全错误的。我怎样才能确定从给定的例子浮点值?

谢谢

c double
3个回答
1
投票

您显示位模式,0 10000001 01001100110011001100110,是用于IEEE-754的基本的32位二进制浮点表示,通常用于float。您要求double,其经常使用IEEE-754的基本的64位的二进制的表示。

你看,cdcc cccc cccc 1440,该字节的5.2的表示,在little-endian顺序。在高值字节,第一位,在位置0x80,是零。它是符号位,零表示乐观。接下来的七位,0x40,并从下一个字节的四个字节,10x14,为指数。总之,他们是0x401。该指数是由0x3ff偏颇。所以,用编码为0x401指数,实际指数为2,这意味着22。

剩余的位进行编码的有效数。他们是0x4cccccccccccd。对于正常的号码,有效数字是一个“小数点”(小数点的一般等价物)与1点之前后放:1.4cccccccccccd16。在小数,即大约1.3(恰好1.3000000000000000444089209850062616169452667236328125)。

一起时,该值为+ 22•1.3000000000000000444089209850062616169452667236328125 = 5.20000000000000017763568394002504646778106689453125。


0
投票

如果你想知道如何在32位浮点具体涉及到64位浮点可以看到符号位,尾数和指数匹配起来的元素。

//Your double in little endian
11001101 11001100 11001100 11001100 11001100 11001100 00010100 01000000    

//for better readability in big endian
01000000 00010100 11001100 11001100 11001100 11001100 11001100 11001101 

//the 32-bit float from the answer you linked
01000000 10100110 01100110 01100110

//1 bit sign  8/11-bit exponent   23/52-bit mantissa
0             10000000 001      01001100 11001100 11001100 11001100 11001100 11001100 1101
0             10000001          01001100 11001100 1100110

为什么指数和尾数的值是都是解释的答案更好的方式,你链接和其他地方比我可以从我的头顶做


© www.soinside.com 2019 - 2024. All rights reserved.