例如给定的程序
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
和下一个字节的四个字节1
的0x14
是指数。它们在一起是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/