C++ gcc 4.1.2:错误:整数常量对于‘;太大;长’;类型

C++ gcc 4.1.2:错误:整数常量对于‘;太大;长’;类型,c++,gcc,hash,g++,C++,Gcc,Hash,G++,我编译了一段关于哈希函数的代码,得到了一个错误:整数常量对于“long”类型来说太大了。我用谷歌搜索了一下,它说要加上后缀“ULL”,但我确实用了ULL作为后缀。这个后缀只有GCC4.4.1支持,我的机器上只有GCC4.1.2,不允许我安装新的编译器。有没有办法更改代码以修复问题 谢谢, -托尼 无符号长散列(字符串k){//FNV散列 无符号长x=14695981039346656037ULL; 对于(unsigned int y=0;y1099511628211对于(32位)长的来说也太大;

我编译了一段关于哈希函数的代码,得到了一个错误:整数常量对于“long”类型来说太大了。我用谷歌搜索了一下,它说要加上后缀“ULL”,但我确实用了ULL作为后缀。这个后缀只有GCC4.4.1支持,我的机器上只有GCC4.1.2,不允许我安装新的编译器。有没有办法更改代码以修复问题

谢谢, -托尼

无符号长散列(字符串k){//FNV散列
无符号长x=14695981039346656037ULL;

对于(unsigned int y=0;y
1099511628211
对于(32位)长的
来说也太大;在那里添加
ULL
后缀

AFAIK,GCC 4.x支持所有x的
long
。事实上,我已经说过GCC 3.x支持
long
,至少对最近的x值是这样


在MacOS X 10.7.2上以32位或64位模式使用G++4.6.1,我很难让您的代码触发任何警告。但是,我可以从XCode 4.X的LLVM编译器那里得到投诉(
G++--version
输出以
i686-apple-darwin11-LLVM-G++-4.2(GCC)4.2.1(基于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;
#定义高位0xcbf29ce4
#定义低位0x84222325
无符号长x=(高位>32,x&UINT\u MAX);
}

将常数拆分为两个32位整数,然后执行
x=高位;x小心-右侧的表达式仅适用于1000000000(10个零)太大,无法成为无符号长
,因此它被视为
,因此整个表达式使用64位
算法处理。@JonathanLeffler是的,我不是100%确定,所以我在发布答案之前尝试了它。请注意,计算是用32位算法完成的,并且即使在64位编译中,refore也会引发警告,例如
警告:左移位计数>=类型宽度
。即使在64位编译中,结果也是
0x84222325
。请尝试:
#包含int main(void){printf(“0x%llX\n”,x)}
加上代码片段。(已测试:MacOS x 10.7.2上的GCC 4.6.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);
}