首页 > 解决方案 > 将 double 解释为十六进制

问题描述

我正在通过打印来自 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第一位应该是符号,0 表示正数,1 表示负数。但是,无论我从哪个方向读取字节,第一位都是 1。9 = 1001 或 f = 1111。我很困惑,因为 0.95... 是正数。

作为仔细检查,以下 python 代码也返回正确的十进制数。 unpack('d', binascii.unhexlify("9ee7799ee779ee3f"))

谁能解释人类如何读取这些字节并到达 0.95238095238095233?

标签: hexdouble

解决方案


想通了,字节的集合被读取为 64 位数字(左侧的第一位),但每个字节都像字符串一样读取(右侧的第一位)。所以我的字节应该首先读取“3F”,3F 从左到右读取,所以我从 0011 1111 等位开始。这给出了预期的 IEEE 754 编码:第一位是符号,接下来的 11 位是指数,然后是分数。


推荐阅读