double 5.2在二进制文件中是如何表示的?
How does double 5.2 is represented in a binary file?
例如给定的程序
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.
剩余的位对有效数的尾部位进行编码。他们是0x4cccccccccccd
。对于普通数字,有效数放在“小数点”(小数点的一般等价物)之后,小数点前加 1:1.4ccccccccccccd16。在十进制中,这大约是 1.3(正好是 1.3000000000000000444089209850062616169452667236328125)。
加在一起,值为+22 • 1.3000000000000000444089209850062616169452667236328125 = 5.20000000000000017763568394002504=646278[436278]
如果您想知道 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
为什么指数和尾数的值是这样的,在你链接的答案和其他地方比我能从头顶做的更好
例如给定的程序
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.
剩余的位对有效数的尾部位进行编码。他们是0x4cccccccccccd
。对于普通数字,有效数放在“小数点”(小数点的一般等价物)之后,小数点前加 1:1.4ccccccccccccd16。在十进制中,这大约是 1.3(正好是 1.3000000000000000444089209850062616169452667236328125)。
加在一起,值为+22 • 1.3000000000000000444089209850062616169452667236328125 = 5.20000000000000017763568394002504=646278[436278]
如果您想知道 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
为什么指数和尾数的值是这样的,在你链接的答案和其他地方比我能从头顶做的更好