Я пытаюсь определить константу, равную 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; }
(uint64_t 1)
неверный синтаксис При кастинге вы можете использовать uint64_t(1)
или же (uint64_t) 1
, Закомментированный пример работает, потому что он следует правильному синтаксису для приведения, как было бы:
const uint64_t test = ((uint64_t)1) << 30;
Вы можете использовать макрос:
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.
Синтаксис, который вы ищете:
const uint64_t test = 1ULL << 30;
Постфикс ULL
используется для целочисленных литералов без знака шириной не менее 64 бит