为什么我的 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) 处理器来说,这是不正确的。
背景
首先,我有一些十六进制数据...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) 处理器来说,这是不正确的。