не может присвоить значение 64-разрядному целому числу на 32-разрядной платформе - PullRequest
6 голосов
/ 22 августа 2010

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

uint64_t Key = 0x100000000;

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

Спасибо

Ответы [ 3 ]

10 голосов
/ 22 августа 2010

Вам нужно сделать целочисленную константу правильного типа. Проблема в том, что 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, вы не должны получать предупреждение (спасибо Джайлз!).

4 голосов
/ 22 августа 2010

То, что вы написали, совершенно верно 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 битами значения.

0 голосов
/ 22 августа 2010

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

uint64_t Key = 0x100000000ULL;
...