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

时间:2019-02-11 23:30:48

标签: c double

例如给定程序

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

所以我不确定在内存和文件中是否使用相同的二进制文件,或者我完全错了。如何从给定的示例确定浮点值?

谢谢

3 个答案:

答案 0 :(得分:1)

您显示的位模式0 10000001 01001100110011001100110是IEEE-754基本的32位二进制浮点表示形式,通常用于float。您需要一个double的表示形式,它通常使用IEEE-754基本的64位二进制文​​件。

您显示的字节cdcc cccc cccc 1440以小尾数顺序表示5.2。在高值字节中,位置0x80的第一位为零。它是符号位,零表示正。接下来的七个位0x40和下一个字节1的{​​{1}}中的四个字节是指数。它们在一起就是0x14。指数受0x401的偏斜。因此,对于指数编码为0x3ff的情况,实际指数为2,表示2 2

其余位对有效位进行编码。它们是0x401。对于普通数,有效数放在“小数点”(小数点的一般等效项)之后,并在该点前加1:1.4cccccccccccccd 16 。以十进制表示,大约为1.3(正好是1.3000000000000000444089209850062616169452667236328125)。

值总计为+ 2 2 •1.3000000000000000444089209850062616169452667236328125 = 5.20000000000000017763568394002504646778106689453125。

答案 1 :(得分: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

为什么指数和尾数的值是您所链接的答案以及其他地方比我从头顶做起的更好解释的方式

答案 2 :(得分:0)