为了账号安全,请及时绑定邮箱和手机立即绑定

Windows 10 64位上双精度的端性是什么?

Windows 10 64位上双精度的端性是什么?

C#
慕森王 2022-08-20 15:14:41
我正在使用c#并编写一个程序来通过UDP发送数字。我在Windows 10 64位平台上,我正在使用BitConverter从整数,双精度等中获取字节。例如:如果我使用:Byte[] data = BitConverter.GetBytes((int)1);我得到,十六进制中的01000000,这将是预期的小端序。如果我使用:Byte[] data = BitConverter.GetBytes((double)1);我得到,十六进制中的0000000000000f03f,这看起来像一个很大的字节序数,但我只是不太确定。我的猜测是,我对字节序或双重格式没有很好的理解。我想Windows商店也有可能与int不同?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

一个有趣的说明。您可能已经知道,C#不定义字节序,它取决于CPU架构,如果您正在编写跨平台/架构应用程序,则可以使用调用BitConverter.IsLittleEndian的方法进行检查。

指示在此计算机体系结构中存储数据的字节顺序(“字节序”)。

言论

不同的计算机体系结构使用不同的字节顺序存储数据。“大端”表示最重要的字节位于单词的左端。“小端”表示最重要的字节位于单词的右端。

注意

您可以通过向方法传递 16 位、32 位或 64 位整数,从网络字节顺序转换为主机的字节顺序,而无需检索字段的值。BitConverter.IsLittleEndianIPAddress.HostToNetworkOrder

如果您需要不同的字节序,则可以使用 轻松转换。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);

}


查看完整回答
反对 回复 2022-08-20
?
噜噜哒

TA贡献1784条经验 获得超7个赞

当然是小端序。

请记住,IEEE浮点是一个位场,符号比指数具有更高的意义,而指数又具有比尾数更高的意义。

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

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

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

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


查看完整回答
反对 回复 2022-08-20
?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

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


查看完整回答
反对 回复 2022-08-20
  • 3 回答
  • 0 关注
  • 98 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信