How to input int64_t / uint64_t constants?

fiktor picture fiktor · Mar 12, 2014 · Viewed 23.5k times · Source

What I'm trying to do is to define a constant equal to 2^30 (I may change it to something like 2^34, so I prefer to have a room larger than 32 bits for it).

Why the following minimal(?) example doesn't compile?

#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; }

Answer

Shafik Yaghmour picture Shafik Yaghmour · Mar 12, 2014

You can use the macro:

UINT64_C

to define a 64bit unsigned integer literal, the cstdint header provides macros for defining integer literals of specific sizes, we see that in section 18.4.1 Header synopsis:

The header also defines numerous macros of the form:

and includes:

plus function macros of the form:

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

We have to go back to the C99 draft standard to find how they work, section 7.18.4.1 Macros for minimum-width integer constants which says:

[...]if uint_least64_t is a name for the type unsigned long long int, then UINT64_C(0x123) might expand to the integer constant 0x123ULL.

as the proper way of defining a 64bit integer constant expression. This is unfortunately not document on cpprefernce but cplusplus.com does document this feature for of the cstdint header as well as the posix reference for stdint.h.