gcc 4.1.2:错误:整数常量对于'long'类型来说太大了

时间:2011-12-27 02:36:13

标签: c++ gcc hash g++

我编译了一段关于哈希函数的代码并得到了错误:整数常量对于'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);
}

3 个答案:

答案 0 :(得分:7)

对于(32位)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);
}