我编译了一段关于哈希函数的代码并得到了错误:整数常量对于'long'类型来说太大了。我做谷歌它,它说添加后缀“ULL”,但我确实有ULL作为后缀。这个后缀仅由gcc 4.4.1支持,我在机器上只有gcc 4.1.2,我不允许安装新的编译器。有没有办法改变代码,以解决问题?
谢谢, 托尼
unsigned long long hash(string k){ //FNV hash
unsigned long long x = 14695981039346656037ULL;
for (unsigned int y=0;y<k.length();y++){
x = x ^ (k[y]);
x = x * 1099511628211;
}
return (x);
}
答案 0 :(得分:7)
1099511628211
, long
也太大了;在那里添加ULL
后缀。
AFAIK,GCC 4. x 支持所有 x 的long long
。实际上,我已经说过GCC 3. x 支持long long
,至少对于 x 的更新值。
我很难让你的代码在32位或64位模式下使用GOS 4.6.1在MacOS X 10.7.2上触发任何警告。但是,我可以从XCode 4.x获取来自LLVM编译器的投诉(g++ --version
输出以i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)
开头)在我添加第二个ULL
之前会抱怨,但仅当我编译时32位模式。如果在64位模式下使用它,它也不会抱怨。
答案 1 :(得分:2)
您可以编写一个计算结果相同的常量表达式:
unsigned long long x = 1469598103UL*10000000000+9346656037UL;
这用g ++ 4.2.1编译
答案 2 :(得分:1)
试试这个:
#define HIGHER_BITS 0xcbf29ce4
#define LOWER_BITS 0x84222325
unsigned long long x = (HIGHER_BITS << 32) | LOWER_BITS;
这两个数字是使用此示例程序获得的:
#include <stdio.h>
#include <limits.h>
int main(int argc, char **argv)
{
unsigned long long x = 14695981039346656037ULL;
printf("0x%08llx, 0x%08llx\n", x >> 32, x & UINT_MAX);
}