在Windows 10 64位上,double的endianes是什么



我正在使用c#并编写一个通过UDP发送数字的程序。我在Windows 10 64位平台上,我使用BitConverter从整数、双精度等中获取字节。

例如:

如果我使用:

Byte[] data = BitConverter.GetBytes((int)1);

我得到了,在HEX中的01000000,正如预期的那样,这将是小endian

如果我使用:

Byte[] data = BitConverter.GetBytes((double)1);

我得到了,000000000000f03f,在HEX中,它看起来像一个big-endian数字,但我只是不太确定。

我的猜测是我对endianes或double格式没有很好的理解。我想也有可能Windows存储区与int不同?

双精度的二进制表示与整数的二进制表示不同。它遵循ieee标准来存储浮点值。使用ieee标准,得到1的二进制表示,然后检查fir字节序。

一个有趣的注释。正如您可能已经知道的,C#没有定义endiannes,它取决于cpu体系结构,如果您正在编写跨平台/体系结构的应用程序,您可以使用调用BitConverter.IsLittleEndian的方法进行检查

指示数据存储的字节顺序("endianness")这种计算机体系结构。

备注

不同的计算机体系结构使用不同的字节存储数据订单。"Big endian"表示最高有效字节在左边一个单词的结尾。"Little endian"表示最高有效字节位于单词的右端。

注意

您可以从网络字节顺序转换为主机的字节顺序计算机,而不检索通过传递16位、32位或64位的BitConverter.IsLittleEndian字段比特整数到CCD_ 5方法。

如果您需要不同的endianne,使用Array.Reverse可以很容易地进行转换。

byte[] bytes = BitConverter.GetBytes(num);
Array.Reverse(bytes, 0, bytes.Length);

或者使用intlong等类型的位开关,您可以使用不安全和其他类型的指针更进一步

public uint SwapBytes(uint x)
{
x = (x >> 16) | (x << 16);
return ((x & 0xFF00FF00) >> 8) | ((x & 0x00FF00FF) << 8);
}
public ulong SwapBytes(ulong x)
{
x = (x >> 32) | (x << 32);
x = ((x & 0xFFFF0000FFFF0000) >> 16) | ((x & 0x0000FFFF0000FFFF) << 16);
return ((x & 0xFF00FF00FF00FF00) >> 8) | ((x & 0x00FF00FF00FF00FF) << 8);
}

当然是小endian。

请记住,IEEE浮点是一个位字段,符号的重要性高于指数,而指数的重要性又高于尾数。

您的整数示例只有一个字段,并且设置了其低位。

您的双重示例在尾数字段中有所有零位,而指数位的更有效字段是非零的。(这两者都受到IEEE-754使用的偏置的影响)

有效位位于较高的内存地址,就像小端整数一样。

作为参考,1.0的IEEE-754为{ sign: 0, exponent: 0x3ff, mantissa: 0x0000000000000 }

最新更新