не может присвоить значение 64-битному целому числу 32-битная платформа

После переключения с 64-битной на 32-битную платформу (обе они являются CentOS), я получаю целочисленная константа, слишком большая для ошибки 'long' type для следующей строки кода

uint64_t Key = 0x100000000;

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

Спасибо

6
задан jackhab 22 August 2010 в 15:33
поделиться

3 ответа

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

10
ответ дан 8 December 2019 в 17:16
поделиться

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

uint64_t Key = 0x100000000ULL;
0
ответ дан 8 December 2019 в 17:16
поделиться

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

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

uint64_t Key = 0x100000000ull;

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

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

4
ответ дан 8 December 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: