例如给定的程序

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

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

谢谢

最佳答案

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

您显示的字节cdcc cccc cccc 1440以小尾数顺序表示5.2。在高值字节中,位置0x80中的第一位为零。它是符号位,零表示正。接下来的七个位0x40和下一个字节的四个字节10x14是指数。它们在一起是0x401。指数受0x3ff的偏见。因此,使用指数编码为0x401,实际指数为2,即22。

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

这些值加在一起为+ 22•1.3000000000000000444089209850062616169452667236328125 = 5.20000000000000017763568394002002646646778106689453125。

关于c - double 5.2如何在二进制文件中表示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54640677/

10-13 02:28