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
}
}
}