例如,给定的程序
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的表示,在little-endian顺序。在高值字节,第一位,在位置0x80
,是零。它是符号位,零表示乐观。接下来的七位,0x40
,并从下一个字节的四个字节,1
的0x14
,为指数。总之,他们是0x401
。该指数是由0x3ff
偏颇。所以,用编码为0x401
指数,实际指数为2,这意味着22。
剩余的位进行编码的有效数。他们是0x4cccccccccccd
。对于正常的号码,有效数字是一个“小数点”(小数点的一般等价物)与1点之前后放:1.4cccccccccccd16。在小数,即大约1.3(恰好1.3000000000000000444089209850062616169452667236328125)。
一起时,该值为+ 22•1.3000000000000000444089209850062616169452667236328125 = 5.20000000000000017763568394002504646778106689453125。
如果你想知道如何在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
为什么指数和尾数的值是都是解释的答案更好的方式,你链接和其他地方比我可以从我的头顶做