2016-02-16 96 views
-1

我读以下从Integer Overflow Wiki行:无符号整数溢出不会“环绕”

而无符号整数溢出导致数目减少模 二的幂,即无符号整数“环绕”在 溢出。

我有下面的代码,我试图创建一个哈希函数并得到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; 
} 
+2

当你说“没有工作”,你是什么意思? –

+0

请注意,这是素数非常不理想的选择。你基本上正在计算'word [0] - word [1] + word [2] - word [3] ...' –

+0

@ChrisBeck更新。我的意思是我能看到负面的价值。 – hagrawal

回答

5

您对printf使用了错误的格式说明符。对于unsigned int,您应该使用%u而不是%d

此外,你应该返回一个unsigned int而不是int的。

+0

啊,非常感谢你好友,格式说明符是罪魁祸首,我并不担心返回类型 – hagrawal

+0

Buddy,一个小小的疑问 - 在我的while循环结束时,'hash'将具有正值,因为它是'unsigned int',所以even日尽管当我使用%d格式说明符时,如何将负值打印出来。理想情况下,无符号整数意味着没有位来保存符号值,那么如何打印负值? – hagrawal

+1

@hagrawal它将无符号值解释为有符号值。例如,如果'hash'包含'0xFFFFFFFF',使用'%d'将输出'-1',而'%u'将输出'4294967295'。 – dbush