2010-02-27 16 views
28

我在我的哈希表实现中使用FNV哈希作为哈希算法,但我在问题标题中获得了此警告行:无法摆脱“这个十进制常量仅在ISO C90中无符号”警告

unsigned hash = 2166136261; 

我不明白为什么会这样,因为当我这样做:

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

我得到这个:

4294967295 
2166136261 

这似乎是在我的机器的限制...

为什么我会得到警告,我有什么选择摆脱它?

回答

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

您需要一个后缀u来表示这是一个无符号数。如果没有u后缀,它将是一个有符号的数字。由于

2166136261 > 2³¹ - 1 = INT_MAX, 

此整数字面值会有问题。

+0

我认为这不会对FNV哈希算法产生任何影响,并且它会始终如其工作? – 2010-02-27 16:23:52

+0

@纳兹:是的。 ____ – kennytm 2010-02-27 19:16:23

+0

请注意,该代码已定义良好,并符合C标准的所有版本 - 后缀仅用于“需要”以使此警告消失,在此情况下,该警告是虚假的。 – 2017-01-10 01:30:05