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