Math.Abs​​与两次转换以检索绝对值

时间:2017-06-19 01:40:57

标签: c# collections

我目前正在C# Collections观看视频,并发现了以下一些引起我兴趣的代码:

int hashKey = (int)((uint)hashCode % capacity);

这与之前的内容有所不同:

int hashKey = Math.Abs(hashCode % capacity);

第一个实现使hashKey的值为 47 ,而第二个实现将其保留为 49 ,前者给出了预期的结果。

我手动添加了字符串" Hello"进入我的哈希表,所以我希望在调用我的函数时检索包含该单词的存储桶,如下所示:

LinkedString results = hash.GetAllAtHash("Hello".GetHashCode());

这是完整性的功能:

public LinkedString GetAllAtHash(int hashCode)
{
     int hashKey = (int)((uint)hashCode % capacity);
     //int hashKey = Math.Abs(hashCode % capacity);
     return values[hashKey];
}

使用单向另一种方式有什么意义吗?为什么他们都返回不同的值,如果我没有观看视频,如果没有编译/运行时错误,我怎么能够告诉错误?

由于

1 个答案:

答案 0 :(得分:0)

这完全是因为uint施法。如果你编写如下代码,你将会得到相同的结果:

 int hashKey = (int)((uint)(hashCode % capacity));

我的意思是将hashCode % capacity放在括号内,然后转换为uint。如果这样做,您将得到第二个hashKey的否定结果。 因此,以下hashKey是相同的:

int hashKey1 = hashCode < 0 ? -(int)((uint)(hashCode % capacity)) : (int)((uint)hashCode % capacity);
int hashKey2 = Math.Abs(hashCode % capacity);

我已经提到,如果没有括号,它首先将hashcode转换为uint(不是%的结果),如果hashCode为否定,则为无符号意志是另一个必然与hashCode不同的数字。