gcc 4.1.2: ошибка: целочисленная константа слишком велика для типа «long» - PullRequest
5 голосов
/ 27 декабря 2011

Я скомпилировал кусок кода о хэш-функции и получил ошибку: целочисленная константа слишком велика для типа 'long'.Я сделал Google это, и он сказал добавить суффикс "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 ]

7 голосов
/ 27 декабря 2011

1099511628211 также слишком велико для (32-разрядного) long; добавьте туда суффикс ULL.

AFAIK, GCC 4. x поддерживает long long для всех x . Действительно, я бы сказал, что GCC 3. x поддерживает long long, по крайней мере, для более поздних значений x .

Мне трудно заставить ваш код вызывать любое предупреждение, используя G ++ 4.6.1 на MacOS X 10.7.2 в 32-битном или 64-битном режиме. Тем не менее, я могу получить жалобу от компилятора LLVM из XCode 4.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-битном режиме, он также не будет жаловаться.

2 голосов
/ 27 декабря 2011

Вы можете написать константное выражение с одинаковым числом:

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

Это компилируется с g ++ 4.2.1

1 голос
/ 27 декабря 2011

Попробуйте это:

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