После переключения с 64-битной на 32-битную платформу (обе они являются CentOS), я получаю целочисленная константа, слишком большая для ошибки 'long' type
для следующей строки кода
uint64_t Key = 0x100000000;
Приведение значения не помогает. Что я делаю не так?
Спасибо
Вам нужно сделать целочисленную константу правильного типа. Проблема в том, что 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, вы не должны получать предупреждения (спасибо, Джайлз!).
Нет гарантии, но вы можете попробовать:
uint64_t Key = 0x100000000ULL;
То, что вы написали, является совершенно правильным C99 (предполагается, что вы #include
d
)¹. Похоже, что вы вызвали компилятор в режиме 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 битами значения.