Как ввести константы int64_t / uint64_t?

Я пытаюсь определить константу, равную 2 ^ 30 (я могу изменить ее на что-то вроде 2 ^ 34, поэтому я предпочитаю иметь комнату размером более 32 бит).

Почему следующий минимальный (?) Пример не компилируется?

#include <stdint.h>
// test.cpp:4:33: error: expected primary-expression before numeric constant
// test.cpp:4:33: error: expected ')' before numeric constant
const uint64_t test = (uint64_t 1) << 30;
//const uint64_t test1 = (uint64_t(1)) << 30;// this one magically compiles! why?

int main() { return 0; }

6

Решение

(uint64_t 1) неверный синтаксис При кастинге вы можете использовать uint64_t(1) или же (uint64_t) 1, Закомментированный пример работает, потому что он следует правильному синтаксису для приведения, как было бы:

const uint64_t test = ((uint64_t)1) << 30;
5

Другие решения

Вы можете использовать макрос:

UINT64_C

чтобы определить 64-битный целочисленный литерал без знака, cstdint заголовок предоставляет макросы для определения целочисленных литералов определенных размеров, мы видим это в разделе 18.4.1 Заголовок синопсис:

Заголовок также определяет многочисленные макросы вида:

и включает в себя:

макросы плюс функции вида:

[U] INT {8 16 32 64 MAX} _C

Мы должны вернуться к проекту стандарта C99, чтобы узнать, как они работают, раздел 7.18.4.1 Макросы для целочисленных констант минимальной ширины который говорит:

[…] если uint_least64_t — это имя типа unsigned long long int,
затем UINT64_C (0x123) может расширяться до целочисленной константы 0x123ULL.

как правильный способ определения 64-битного целочисленного константного выражения. К сожалению, это не документ о cpprefernce, но cplusplus.com документирует эту функцию для cstdint заголовок, а также ссылка posix для stdint.h.

26

Синтаксис, который вы ищете:

const uint64_t test = 1ULL << 30;

Постфикс ULL используется для целочисленных литералов без знака шириной не менее 64 бит

9
По вопросам рекламы [email protected]