2010-02-27 21 views
28

J'utilise le hachage FNV comme un algorithme de hachage sur ma mise en œuvre Table Hash mais je reçois l'avertissement dans le titre de la question sur ce ligne:Impossible de se débarrasser de "cette constante décimale est non signée uniquement dans ISO C90" avertissement

unsigned hash = 2166136261; 

Je ne comprends pas pourquoi cela se passe parce que quand je fais ceci:

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

Je reçois ceci:

4294967295 
2166136261 

Ce qui semble être dans les limites de ma machine ...

Pourquoi est-ce que je reçois l'avertissement et quelles sont mes options pour m'en débarrasser?

Répondre

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

Vous avez besoin d'un suffixe u pour signifier c'est un nombre non signé. Sans le suffixe u, il s'agira d'un nombre signé. Puisque

2166136261 > 2³¹ - 1 = INT_MAX, 

ce littéral entier sera problématique.

+0

Je suppose que cela n'implique aucune implication dans l'algorithme de hachage FNV et qu'il fonctionnera toujours comme il le devrait? –

+0

@Naz: Oui. ____ – kennytm

+0

Notez que le code est bien défini et est conforme à toutes les versions de C Standard - le suffixe est seulement "nécessaire" pour faire taire un avertissement qui, dans ce cas, est faux. –