是否存在一个整数类型,如果它溢出,它将回到-2,147,483,648?

时间:2013-10-10 18:14:22

标签: c#

我正在实现一个对象树。此树中的每个类都有一些属性和GetHashCode()方法。我打算做的是组合所有属性的哈希值,然后将该哈希值与子节点的哈希值结合起来。我目前不在Visual Studio的前面,但代码看起来像这样:

class Node
{
  public int Prop1 {get; set;}
  public string Prop2 {get; set;}
  public IEnumerable<Node> Children {get; set; }
  private int _hash;
  public override int GetHashCode()
  {   
      if (_hash == 0)
      {
        _hash = 17;
        _hash = _hash * 31 + Prop1.GetHashCode();
        _hash = _hash * 31 + Prop2.GetHashCode();
        foreach(var child in Children)
        {
            _hash = _hash * 31 + child.GetHasCode();
        }
      }
      return _hash;
  }
}

这应该可以工作但是我担心会遇到如此大的值,我溢出了int 32类型。是否有一种不同的类型可以防止这种情况,但我仍然可以作为一个int返回?我曾经想过使用模数和uint,但我怎么会把它重新转换成有效的int?我可以这样做:

unit _hash = 0;
public override int GetHashCode()
{
   // See code above
   return (int)((_hash % 4294967295) - int.MaxValue);
}

或者有更好的方法吗?

2 个答案:

答案 0 :(得分:6)

使用unchecked对代码进行环绕,以抑制对整数类型算术运算和转换的溢出检查:

public override int GetHashCode()
{  
  unchecked
  { 
      if (_hash == 0)
      {
        _hash = 17;
        _hash = _hash * 31 + Prop1.GetHashCode();
        _hash = _hash * 31 + Prop2.GetHashCode();
        foreach(var child in Children)
        {
            _hash = _hash * 31 + child.GetHasCode();
        }
      }
      return _hash;
  }
}

答案 1 :(得分:0)

除了@Magnus awnser之外,您还可以在Build&gt;下的项目属性中启用/禁用算术溢出检查。先进