我正在通过打印C#表示形式的原始字节来处理存储在文件中的双打(64位)。例如,十进制数0.95238095238095233以十六进制形式存储为字节“ 9e e7 79 9e e7 79 ee 3f”。一切都按预期进行,我可以读写,但是我希望能够理解自己的双重表示。
根据C#文档https://docs.microsoft.com/en-us/dotnet/api/system.double?view=netframework-4.7.2#explicit-interface-implementations和维基百科https://en.wikipedia.org/wiki/Double-precision_floating-point_format,第一位应该是正号,负数为1。但是,无论我读取字节的方向如何,第一位都是1。9 = 1001或f =1111。我很困惑,因为0.95 ...是正数。
仔细检查一下,以下python代码也会返回正确的十进制数字。
unpack('d', binascii.unhexlify("9ee7799ee779ee3f"))
有人可以解释人类如何读取这些字节并获得0.95238095238095233吗?
答案 0 :(得分:0)
弄清楚,字节的集合像一个64位数字(左边的第一位)一样被读取,但是每个字节像一个字符串(右边的第一位)一样被读取。所以我的字节应该先读为“ 3F”,3F从左到右读取,所以我从0011 1111等位开始。这给出了IEEE 754编码的预期结果:第一位是符号,接下来的11位是指数,然后是分数。