例如给定的程序
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
和下一个字节的四个字节 0x14
的 1
是指数。它们一起是 0x401
。指数偏移 0x3ff
。因此,对于编码为 0x401
的指数,实际指数为 2,即 22。
剩余的位编码有效数字的尾随位。它们是 0x4ccccccccccccd
。对于普通数字,有效数字放在“小数点”(小数点的一般等价物)之后,小数点前加 1:1.4ccccccccccccd16。在十进制中,这大约是 1.3(正好是 1.3000000000000000444089209850062616169452667236328125)。
加起来的值为 + 22 • 1.3000000000000000444089209850062616169452667236328125 = 5.2000000000000001776356839400250464677810316594.
关于c - double 5.2在二进制文件中是如何表示的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54640677/