我从Integer Overflow Wiki开始阅读以下内容:
而无符号整数溢出导致数字以模数减少 2的幂,意味着无符号整数"环绕"上 溢出。
我在下面的代码中我试图创建一个哈希函数并获得int溢出情况。我尝试使用unsigned int
来缓解它,但它没有工作,我能够看到负值。
我知道我可以通过其他方式处理它并且它可以正常工作,如我的代码注释中所示 - Comment 2:
。但这是正确的方式,为什么unsigned int
没有缠绕和溢出?
int hash(char *word) {
char *temp = word;
unsigned int hash = 0; // Comment 1: I tried to handle int overflow using "unsigned" int.
while (*word != '\0') {
// Comment 2: This works but I do not want to go this way.
//while ((hash * PRIME_MULTIPLIER) < 0) {
// hash = (hash * PRIME_MULTIPLIER) + 2147483647;
//}
hash = hash * PRIME_MULTIPLIER + *word;
word++;
}
printf("Hash for %s is %d\n", temp, hash);
return hash;
}
答案 0 :(得分:5)
您使用printf
的错误格式说明符。对于unsigned int
,您应该使用%u
而不是%d
。
此外,您应该返回unsigned int
而不是int
。