BitConverter.GetBytes() 显示不正确的值?

BitConverter.GetBytes() showing incorrect value?

我正在尝试查看 System.Single 值在内存中的表示方式。

根据我的阅读,System.Single 表示如下:

1 个符号位 (s)、23 位小数有效位 (f) 和一个 8 位偏置指数 (e)。

(-1)^s * 1.f * 2^(e-127)

在 16777216 的情况下,s = 0, f = 00000000000000000000000(23 个零),e = 151 = 10010111

即。 1.00000000000000000000000 * 2^24

在记忆中,我希望它看起来像这样(符号位、小数有效数、有偏指数):

 0 00000000000000000000000 10010111

或以字节为单位:

00000000 00000000 00000000 10010111

但是它给了我这个:

00000000 00000000 10000000 01001011

看起来有偏差的指数中缺少最后一位,并且在第 3 个字节的开头随机出现一个 1,这是为什么?

我能够通过反转每个字节中的位找到正确的指数:

00000000 00000000 00000001 11010010

取最后 9 位并再次反转:

00000000 00000000 0000000 010010111

现在这与我的预期相同,但是这个奇怪的顺序是怎么回事?

这个二进制数是以什么格式存储的?

这是我的代码:

using System;
using System.Linq;

namespace SinglePrecision
{
    class Program
    {
        static void Main(string[] args)
        {
            Single a = 16777216;            
            byte[] aBytes = BitConverter.GetBytes(a);
            string s = string.Join(" ", aBytes.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')));
            //s = 00000000 00000000 10000000 01001011
        }
    }
}

首先,你 order of the parts 错了。它是符号位 s,然后是指数 e,然后是小数 f,因此您正确计算的二进制表示将是

0 10010111 00000000000000000000000
s e        f

这些位存储在内存的 4 个连续字节中:

01001011 10000000 00000000 00000000
se        f
byte1    byte2    byte3    byte4

但是因为你的系统是little-endian,它们的存储顺序是相反的:

00000000 00000000 10000000 01001011
byte4    byte3    byte2    byte1

Endiannes 颠倒字节顺序,但不会颠倒一个字节内的位顺序。

最右边字节是float值的第一个逻辑字节,其最左边位是符号位,即0.
右起第二个字节是第二个逻辑字节,它的 lefmost 位是指数的 last 位。