Windows 10 64bit上的double的终结性是什么?

时间:2019-01-31 22:30:39

标签: c# double endianness bitconverter

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

例如:

如果我使用:

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

我得到的十六进制值为 01000000 ,应该是小尾数

如果我使用:

curl -XPOST "https://openid-connect.onelogin.com/oidc/token" \ -H "Authorization: Basic < base64 encoded client_id:client_secret>" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=refresh_token&refresh_token==<refresh_token>" -i HTTP/1.1 401 Unauthorized Cache-Control: no-cache, no-store Content-Length: 77 Content-Type: application/json; charset=utf-8 Date: Thu, 31 Jan 2019 22:27:55 GMT Pragma: no-cache Www-Authenticate: Basic realm="https://openid- connect.onelogin.com/oidc", error="invalid_client", error_description="client authentication failed" X-Powered-By: Express Set-Cookie: ol_oidc_canary_3=false; path=/; domain=.onelogin.com {"error":"invalid_client","error_description":"client authentication failed"}%

我得到了十六进制的 000000000000f03f ,它看起来像一个大端的数字,但我不确定。

我的猜测是,我对字节序或双重格式没有很好的了解。我想Windows也有可能存储不同于整数的double吗?

3 个答案:

答案 0 :(得分:1)

double的二进制表示形式不同于整数。它遵循用于存储浮点值的ieee标准。使用ieee标准,获取二进制表示形式1,然后检查fir字节序。

答案 1 :(得分:0)

一个有趣的笔记。您可能已经知道,C#并未定义字节序,它取决于cpu架构,如果您正在编写跨平台/架构应用程序,则可以使用方法BitConverter.IsLittleEndian

进行检查。
  

表示存储数据的字节顺序(“字节序”)   这种计算机体系结构。

     

备注

     

不同的计算机体系结构使用不同的字节存储数据   订单。 “大端”表示最高有效字节在左侧   一句话的结尾。 “小尾数”表示最高有效字节在   单词的右端。

     

注意

     

您可以从网络字节顺序转换为主机的字节顺序   计算机,而不会检索   BitConverter.IsLittleEndian字段通过传递16位,32位或64   IPAddress.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);
}

答案 2 :(得分:0)

肯定是小端的。

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

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

您的double示例在尾数字段中全为零,而指数位的更高有效字段为非零。 (这两者都受到IEEE-754使用的偏差的影响)

有效位位于较高的存储器地址,就像使用小尾数整数一样。

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