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

C# BitConverter.GetBytes()显示的值不正确?,c#,math,floating-point,binary,.net-4.7.2,C#,Math,Floating Point,Binary,.net 4.7.2,我想看看系统是如何在内存中表示单个值的 据我所知,System.Single表示如下: 1个符号位(s)、23位小数有效位(f)和8位偏置指数(e) 在16777216的情况下,s=0,f=000000000000000000(23个零),e=151=10010111 即1.00000000000000000000000*2^24 在内存中,我希望它看起来像这样(符号位、分数有效位、偏置指数): 或以字节为单位: 00000000 00000000 00000000 10010111 但它却给

我想看看
系统是如何在内存中表示单个
值的

据我所知,
System.Single
表示如下:

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

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

1.00000000000000000000000*2^24

在内存中,我希望它看起来像这样(符号位、分数有效位、偏置指数):

或以字节为单位:

00000000 00000000 00000000 10010111
但它却给了我这个:

00000000 00000000 10000000 01001011
看起来偏倚指数的最后一位丢失了,第三个字节的开头有一个随机的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
        }
    }
}
首先,你搞错了。它是符号位
s
,然后是指数
e
,然后是分数
f
,因此,您的二进制表示形式(如果没有正确计算)将是

0 10010111 00000000000000000000000
s e f
这些位存储在4个连续字节的内存中:

01001011 10000000 00000000
瑟夫
字节1字节2字节3字节4
但由于您的系统是这样的,所以它们的存储顺序是相反的:

00000000 00000000 10000000 01001011
字节4字节3字节2字节1
Endiannes反转字节的顺序,但不反转字节内的位顺序

最右边的字节是浮点值的第一个逻辑字节,最左边的位是符号位,即
0

从右字节开始的第二个字节是第二个逻辑字节,它最左边的一位是指数的最后一位。

首先,你搞错了。它是符号位
s
,然后是指数
e
,然后是分数
f
,因此,您的二进制表示形式(如果没有正确计算)将是

0 10010111 00000000000000000000000
s e f
这些位存储在4个连续字节的内存中:

01001011 10000000 00000000
瑟夫
字节1字节2字节3字节4
但由于您的系统是这样的,所以它们的存储顺序是相反的:

00000000 00000000 10000000 01001011
字节4字节3字节2字节1
Endiannes反转字节的顺序,但不反转字节内的位顺序

最右边的字节是浮点值的第一个逻辑字节,最左边的位是符号位,即
0


右字节的第二个是第二个逻辑字节,最左边的位是指数的最后一位。

GetBytes方法返回的数组中字节的顺序取决于计算机体系结构是little-endian还是big-endian。GetBytes方法返回的数组中字节的顺序取决于计算机体系结构是little-endian还是big-endian。
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
        }
    }
}