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

Why doesn't my 32-bit integer convert into a float properly?

背景

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

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

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

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

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

0.0016174268

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

-1.406E+14

问题

谁能解释一下这是怎么回事?

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

快速回答:您的 numBytes 数组中的字节顺序倒转了。

由于您使用 C# 进行编程,因此我假设您 运行 使用的是 Intel 处理器,而 Intel 处理器是小端;也就是说,它们首先存储(并期望)最低有效字节。在您的 numBytes 数组中,您将最重要的字节放在第一位。

BitConverter 与其说是 convert 字节数组数据,不如说是 将其解释 为另一种基本数据类型。想想保存字节数组的物理内存:

b0 | b1 | b2 | b3.

将字节数组解释为单精度浮点数,必须知道机器的字节序,即 LSByte 是第一个还是最后一个。 LSByte 最后出现似乎很自然,因为我们中的许多人都是这样阅读的,但对于小端 (Intel) 处理器来说,这是不正确的。