【问题标题】:gcc 4.1.2: error: integer constant is too large for ‘long’ typegcc 4.1.2:错误:整数常量对于“长”类型来说太大了
【发布时间】:2011-12-27 02:36:12
【问题描述】:

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

【问题讨论】:

  • 把你的常数分成两个 32 位整数,然后做x = thehigherbits; x &lt;&lt;= 32; x = x | thelowerbits;,也许吧?

标签: c++ gcc hash g++


【解决方案1】:

1099511628211 对于(32 位)long 来说也太大了;在此处也添加ULL 后缀。

AFAIK,GCC 4。x 支持所有 xlong long。事实上,我会说 GCC 3.x 支持 long 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 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00) 开始)收到投诉,直到我添加第二个ULL,但前提是我在 32 位模式下编译。如果在 64 位模式下使用,它也不会报错。

【讨论】:

  • 是的,我忘了把那个数字设为 ULL。谢谢!
【解决方案2】:

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

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

这使用 g++ 4.2.1 编译

【讨论】:

  • 小心——右边的表达式只有效,因为10000000000(10个零)太大而不能成为unsigned long,所以它被视为long long,因此整个表达式是使用 64 位 long long 算法处理。
  • @JonathanLeffler 是的,我不是 100% 确定这一点,所以我在发布答案之前尝试了它。
【解决方案3】:

试试这个:

#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);
}

【讨论】:

  • 请注意,计算是在 32 位算术中完成的,因此即使在 64 位编译中也会引发诸如 warning: left shift count &gt;= width of type 之类的警告。结果是0x84222325,即使在 64 位编译中也是如此。试试:#include &lt;stdio.h&gt; int main(void) { printf("0x%llX\n", x);} 加上代码片段。 (测试:在 MacOS X 10.7.2 上测试 GCC 4.6.1。)
猜你喜欢
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多