为什么System.Net.IPAddress使用签名类型?

时间:2014-10-25 01:21:14

标签: c# .net network-programming signedness

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

这使得有必要在将HostToNetworkOrder用作IPAddress构造函数的参数时从 UInt32 netOrderU32 = (UInt32)IPAddress.HostToNetworkOrder((Int32)ipVal); IPAddress tempIP = new IPAddress(netOrderU32); 转换结果,从而产生如下代码:

IPAddress(Int64)

如果网络顺序值不是无符号的,则地址(如192.168.0.255)将导致ArgumentOutOfRangeException。这可能是由{{1}}不接受大于0x00000000FFFFFFFF的值引起的,但从Int32转换时,(net-order)192.168.0.255的Int64表示是0xffffffffff00a8c0吗?

即使IP地址没有任何签名概念,使用签名类型是否有任何意义?似乎只使用无符号类型会更简单。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

如果不完整了解您的具体应用(以及字节交换的需要),很难判断您在此处所做的事情是否真的存在问题。