2016-02-16 26 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