2010-02-27 9 views
28

Ich verwende den FNV-Hash als Hashalgorithmus für meine Hashtabellenimplementierung, aber ich bekomme die Warnung im Titel der Frage dazu Leitung:Kann nicht loswerden "diese Dezimalkonstante ist nur in ISO C90 unsigned" Warnung

unsigned hash = 2166136261; 

ich verstehe nicht, warum dies geschieht, weil, wenn ich dies tun:

4294967295 
2166136261 
:

printf("%u\n", UINT_MAX); 
printf("2166136261\n"); 

ich diese bekommen 10

Das scheint unter den Grenzen meiner Maschine zu sein ...

Warum bekomme ich die Warnung und was sind meine Optionen, um es loszuwerden?

Antwort

41
unsigned hash = 2166136261u; // note the u. 

Sie benötigen einen Suffix u zu bedeuten diese eine Zahl ohne Vorzeichen ist. Ohne das Suffix u wird es eine vorzeichenbehaftete Nummer sein. Seit

2166136261 > 2³¹ - 1 = INT_MAX, 

dieses Integer-Literal wird problematisch sein.

+0

Ich nehme an, dass keine Auswirkungen in der FNV-Hashalgorithmus auferlegt, und dass es immer so funktioniert wie es sollte? –

+0

@Naz: Ja. ____ – kennytm

+0

Beachten Sie, dass der Code gut definiert ist und alle Versionen von C Standard erfüllt - das Suffix ist nur "erforderlich", um eine Warnung zu unterdrücken, die in diesem Fall falsch ist. –