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 位。
我正在尝试查看 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 位。