【问题标题】:Why does System.Net.IPAddress use signed types?为什么 System.Net.IPAddress 使用有符号类型?
【发布时间】:2014-10-25 01:21:14
【问题描述】:

System.Net.IPAddress 中的方法 IPAddress(Int64)Int32 HostToNetworkOrder(Int32) 都使用签名类型的 IP 地址。

这使得在将HostToNetworkOrder 的结果用作IPAddress 构造函数的参数时,必须将结果转换为IPAddress 构造函数,从而产生如下代码:

            UInt32 netOrderU32 = (UInt32)IPAddress.HostToNetworkOrder((Int32)ipVal);
            IPAddress tempIP = new IPAddress(netOrderU32);

如果network-order值不是无符号的,192.168.0.255等地址会引发ArgumentOutOfRangeException。这可能是由于IPAddress(Int64) 不接受大于 0x00000000FFFFFFFF 的值但从 Int32 转换时 (net-order)192.168.0.255 的 Int64 表示为 0xffffffffff00a8c0 引起的吗?

即使 IP 地址没有任何签名概念,使用签名类型有什么意义吗?似乎只使用无符号类型会简单得多。

选择签名类型有什么具体原因吗?

【问题讨论】:

  • 简单地说,无符号类型不是CLSCompliant

标签: c# .net network-programming signedness


【解决方案1】:

似乎在这种情况下选择有符号而不是无符号是因为某些平台如何处理有符号和无符号数字。

This post 阐明了 .NET 库和函数需要使用带符号整数而不是无符号整数的事实,因此它们可以保持与不提供显式无符号类型的语言的可移植性。

This post 详细说明了 C# 选择使用有符号整数的具体原因,因为无符号整数不符合 CLS。 阅读更多关于 here 的信息。

如果不全面了解您的特定应用程序(以及字节交换的需要),很难判断您在这里所做的事情是否真的有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-12
    • 2011-06-29
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多