Как ввести константы 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; }

3 ответов


(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 МАКС} ° С

мы должны вернуться к проекту стандарта 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 бит.