2011-12-27 2 views
5

Я скомпилировал фрагмент кода о хэш-функции и получил ошибку: целочисленная константа слишком велика для «длинного» типа. Я сделал Google, и он сказал, чтобы добавить суффикс «ULL», но у меня был ULL как суффикс. Этот суффикс поддерживается только gcc 4.4.1, и у меня есть только gcc 4.1.2 на машине, и мне не разрешено устанавливать новый компилятор. Есть ли способ изменить код, чтобы устранить проблему?gcc 4.1.2: ошибка: целочисленная константа слишком велика для «длинного» типа

Спасибо, -Tony

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); 
} 
+0

Разделите свою константу на два 32-битных целых числа, затем выполните 'x = thehigherbits; x << = 32; x = x | возможно,? – fge

ответ

7

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

AFAIK, GCC 4. х поддерживает long long для всех х. Действительно, я бы сказал, что 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-битном режиме, он также не жалуется.

+0

Да, я забыл сделать это число ULL. Спасибо! – Tony

2

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

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

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

+0

Будьте осторожны - выражение справа работает только потому, что 10000000000 (10 нолей) слишком велико, чтобы быть 'unsigned long', поэтому он рассматривается как' long long', и поэтому все выражение обрабатывается с использованием 64-битного 'long long' арифметика. –

+0

@ JonathanLeffler Да, я не был на 100% уверен в этом, поэтому я попробовал это, прежде чем публиковать ответ. – dasblinkenlight

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); 
} 
+0

Обратите внимание, что вычисление выполняется в 32-разрядной арифметике и поэтому вызывает предупреждения, такие как 'warning: left shift count> = width of type' даже в 64-битной компиляции. Результатом является '0x84222325', даже в 64-битной компиляции. Попробуйте: '#include int main (void) {printf (" 0x% llX \ n ", x);}' плюс фрагмент кода. (Протестировано: GCC 4.6.1 на MacOS X 10.7.2.) –

Смежные вопросы