2010-02-27 17 views
28

Sto usando l'hash FNV come algoritmo di hash sull'implementazione della tabella hash ma sto ricevendo l'avviso nel titolo della domanda su questo linea:Impossibile eliminare "questa costante decimale è senza segno solo in ISO C90" avviso

unsigned hash = 2166136261; 

non capisco perché questo sta accadendo perché quando faccio questo:

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

ottengo questo:

4294967295 
2166136261 

Quale sembra essere sotto i limiti della mia macchina ...

Perché ricevo l'avviso e quali sono le opzioni per eliminarlo?

risposta

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

Hai bisogno di un suffisso u per indicare questo è un numero senza segno. Senza il suffisso u sarà un numero firmato. Dal

2166136261 > 2³¹ - 1 = INT_MAX, 

questo intero letterale sarà problematico.

+0

Suppongo che non imponga alcuna implicazione nell'algoritmo di hashing FNV e che funzionerà sempre come dovrebbe? –

+0

@Naz: Sì. ____ – kennytm

+0

Si noti che il codice è ben definito e conforme a tutte le versioni di C Standard - il suffisso è solo "necessario" per silenziare un avviso che, in questo caso, è spurio. –