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

gcc 4.1.2: error: integer constant is too large for ‘long’ type

本文关键字:long 类型 错误 整型常量 GCC      更新时间:2023-10-16

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

1099511628211对于(32位)long来说也太大了;再加上ULL后缀

AFAIK, GCC 4。x支持所有xlong long。实际上,我会说GCC 3。x支持long long,至少对于x最近的值。

我很难让你的代码触发任何警告,在32位或64位模式下使用MacOS X 10.7.2上的g++ 4.6.1。然而,我可以从XCode 4的LLVM编译器中得到投诉。x (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位模式下使用,它也不会报错。

您可以编写一个计算结果相同的常量表达式:

unsigned long long x = 1469598103UL*10000000000+9346656037UL;

使用g++ 4.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%08llxn", x >> 32, x & UINT_MAX);
}