读取以字符数组中的二进制格式存储的double

时间:2013-02-10 15:18:38

标签: c++ floating-point binary

我试图在char数组中读取存储为特定二进制格式的浮点数。格式如下,其中每个字母代表一个二进制数字:

SEEEEEEE MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM

website中更清楚地解释了格式。基本上,指数是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);

它将每个8位字节大小存储在char数组中,并根据其在数组中的索引向左移位。所以如果我拥有的数组如下:

{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;

这里出了什么问题?另外,我很想知道如何在理想情况下实现这样的转换?

1 个答案:

答案 0 :(得分:1)

我没有尝试过运行你的代码,但我怀疑你得到这个原因:

0x27f4c18f5c27f6

而不是

0x28f5c28f5c28f6

是因为您之前的单元格中有一个“负数”。您的8位字节数组是有符号值还是无符号值?我希望如果你使它无符号它会更好。 [或者在转换操作之前移动你的演员阵容]。