为什么我的32位整数没有正确转换为浮点数?

时间:2016-04-25 16:33:56

标签: c# hex bit-manipulation byte bit

背景

首先,我有一些十六进制数据...... 0x3AD3FFD6。我已选择将此数据表示为字节数组,如下所示:

byte[] numBytes = { 0x3A, 0xD3, 0xFF, 0xD6 };

我尝试通过执行以下代码将此字节数组转换为其单精度浮点值:

float floatNumber = 0;
floatNumber = BitConverter.ToSingle(numBytes, 0);

我使用this IEEE 754 Converter在线计算得到了以下结果:

0.0016174268

enter image description here

我希望C#代码的输出产生相同的东西,但我得到类似的东西......

-1.406E + 14

问题

有人可以解释这里发生了什么吗?

2 个答案:

答案 0 :(得分:3)

字节顺序错误。 BitConverter使用底层系统的端点(计算机体系结构),确保始终使用正确的字节序。

答案 1 :(得分:0)

快速回答:你的numBytes数组中的字节顺序是向后的。

由于您使用C#进行编程,我认为您使用的是英特尔处理器,而英特尔处理器是小端的;也就是说,它们首先存储(并期望)最不重要的字节。在您的numBytes数组中,您首先放置最重要的字节。

BitConverter没有那么多转换字节数组数据,因为它将解释它作为另一种基本数据类型。想想保存字节数组的物理内存:

b0 | b1 | b2 | B3。

要将解释该字节数组作为单精度浮点数,必须知道机器的字节序,即LSByte是先存储还是最后存储。 LSByte可能看起来很自然,因为我们很多人都是这样看的,但对于小端(英特尔)处理器来说,这是不正确的。