我正在尝试读取以特定二进制格式存储在 char 数组中的浮点数。格式如下,其中每个字母代表一个二进制数字:
SEEEEEEE MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM
本网站对格式进行了更清楚的说明。基本上,指数采用 Excess-64 表示法,尾数归一化为 <1 和 >1/16 的值。为了得到数字的真值,尾数乘以 16 的指数真值的幂。
基本上,到目前为止我所做的是提取符号和指数值,但我在提取尾数时遇到了麻烦。我正在尝试的实现是相当蛮力的,并且在代码方面可能远非理想,但在我看来它是最简单的。它基本上是:
unsigned long a = 0;
for(int i = 0; i < 7; i++)
a += static_cast<unsigned long>(m_bufRecord[index+1+i])<<((6-i)*8);
它获取存储在 char 数组中的每个 8 位字节大小,并根据其在数组中的索引将其左移。因此,如果我拥有的数组如下:
{0x3f, 0x28, 0xf5, 0xc2, 0x8f, 0x5c, 0x28, 0xf6}
我期望a
获得价值:
0x28f5c28f5c28f6
但是,通过上述实现a
获取值:
0x27f4c18f5c27f6
稍后,我使用以下代码将长整数转换为浮点数:
double m = a;
m = m*(pow(16, e-14));
m = (s==1)?-m:m;
这里出了什么问题?另外,我很想知道如何理想地实现这样的转换?