views:

544

answers:

2

Hi,

I'm using the FNV hash as a hashing algorithm on my Hash Table implementation but I'm getting the warning in the question title on this line:

unsigned hash = 2166136261;

I don't understand why this is happening because when I do this:

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

I get this:

4294967295
2166136261

Which seems to be under the limits of my machine...

Why do I get the warning and what are my options to get rid of it?

+4  A: 
unsigned hash = 2166136261u; // note the u.

You need a suffix u to signify this is an unsigned number. Without the u suffix it will be a signed number. Since

2166136261 > 2³¹ - 1 = INT_MAX,

this integer literal will be problematic.

KennyTM
I assume that doesn't impose any implications in the FNV hashing algorithm and that it will always work as it should?
Nazgulled
@Naz: Yes. ____
KennyTM
+1  A: 

The C90 Standard says

The type of an integer constant is the first of the corresponding list in which its value can be represented. Unsuffixed decimal: int, long int, unsigned long int;

Your literal has no suffix (like u for unsigned or L for long). C99 has a different list: int, long int, long long int. Yet another rule has C++ (the current edition), which has the list: int, long int (current C++ has no long long int type).

Now your line initializing to 2166136261 apparently would have unsigned long int type in C90 on this compiler (because it would not fit long int) even though it could also fit unsigned int. But on C99, it would have the type long long int.

Johannes Schaub - litb