簡體   English   中英

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                      .......@

但我發現如何在 C 中表示內存中的 FLOAT 數,它應該看起來像

0 10000001 01001100110011001100110

所以我不確定它在內存和文件中是否是相同的二進制文件,或者我完全錯了。 如何從給定的示例中確定浮點值?

您顯示的位模式0 10000001 01001100110011001100110用於 IEEE-754 基本 32 位二進制浮點表示,通常用於float 您請求double的表示,它通常使用 IEEE-754 基本 64 位二進制。

您顯示的字節cdcc cccc cccc 1440以小端順序表示大約 5.2。 在高值字節中,位置0x80的第一位為零。 它是符號位,零表示正數。 接下來的七位0x40和下一個字節的四個字節,即0x141 ,是指數。 它們一起是0x401 指數有偏差0x3ff 因此,當指數編碼為0x401 ,實際指數為 2,即 2 2

其余位對有效數的尾隨位進行編碼。 它們是0x4cccccccccccd 對於普通數字,有效數放在“小數點”(小數點的一般等價物)之后,小數點前加 1: 1.4cccccccccccd 16 以十進制表示,大約是 1.3(正好是 1.3000000000000000444089209850062616169452667236328125)。

加起來,該值是 + 2 2 • 1.3000000000000000444089209850062616169452667236328125 = 5.20000000000000017763568300444089209850062616169452667236328125 = 5.200000000000000177635685946406562650062

如果您想知道 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

為什么指數和尾數的值是在您鏈接的答案和其他地方的解釋方式,而不是我從頭頂上做的更好

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM