2010-08-22 2 views
6

После переключения с 64-битной до 32-битной платформе (оба из них CentOS) Я получаю integer constant is too large for ‘long’ type ошибку в следующей строке кодане может присвоить значение 64-разрядного целого числа на 32-битной платформе

uint64_t Key = 0x100000000; 

Передача значения не помогает. Что я делаю не так?

Благодаря

ответ

10

Вам нужно сделать целую константу правильного типа. Проблема заключается в том, что 0x100000000 интерпретируется как int, а литье/присвоение не помогает: сама константа слишком велика для int. Вы должны быть в состоянии определить, что константа имеет uint64_t типа:

uint64_t Key = UINT64_C(0x100000000); 

сделает это. Если у вас нет UINT64_C доступных, попробуйте:

uint64_t Key = 0x100000000ULL; 

В самом деле, в C99 (6.4.4.1p5):

Тип целой константы является первым из соответствующего списка в который может быть представлен.

и список шестнадцатеричных констант без какого-либо суффикса:

int 
long int unsigned int 
long int 
unsigned long int 
long long int 
unsigned long long int 

Так что, если вы запустили ваш компилятор в режиме C99, вы не должны получить предупреждение (спасибо Giles!).

0

Нет гарантии, но вы можете попробовать:

uint64_t Key = 0x100000000ULL; 
4

То, что вы написали, действительно действует C99 (если у вас есть #include d <stdint.h>) ¹. Таким образом, похоже, что вы использовали ваш компилятор в режиме C89, а не в режиме C99. В C89 нет гарантии наличия 64-битного типа, но это распространенное расширение.

Поскольку вы работаете в Linux, ваш компилятор предположительно gcc. Gcc поддерживает 64-разрядный long long на всех платформах, даже в режиме C89. Но вы, возможно, придется явно объявить константу, как long long:

uint64_t Key = 0x100000000ull; 

(ll означает long long; u означает без знака и не является обязательным здесь). Кроме того, вы можете запустить gcc в режиме C99 с помощью gcc -std=c99.

¹ для юристов языка: и имеют интегральный тип с ровно 64 битами ценности.

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

  • Нет связанных вопросов^_^