问题
constexpr auto v = static_cast<std::uint64_t>(1) << 32;
is not ideal, because of the tedious syntax and the cast which is semantically indirect. From this thread, I learned constexpr auto v = UINT64_C(1) << 32;
However, the precise semantics of the macro is
expands to an integer constant expression having the value specified by its argument and the type
uint_least64_t
.
Therefore, it's not exactly uint64_t
. I'm wondering what is the best/proper way to define uint64_t
constants.
Note that unsigned long long
doesn’t necessarily map to uint64_t
.
Update
I'm reluctant to use functional/C-style cast, because some (e.g., Google C++ Coding Style) say it's from C, and modern C++ should avoid using them. Looks like I should have my own opinion on this, instead of blindly following others.
回答1:
Therefore, it's not exactly
uint64_t
. I'm wondering what is the best/proper way to defineuint64_t
constants.
If you want to be absolutely sure, you can write uint64_t(1)
(possibly std::
-qualified) instead as a shorter alternative to your static_cast
.
For practical purposes, UINT64_C
is fine though. Implementations aren't required to define uint64_t
if they don't provide any type which meets its requirements. It makes sense because of that to define UINT64_C
in terms of uint_least64_t
.
But on implementations where uint64_t
does exist -- and you're implicitly already assuming you're using such an implementation -- uint64_t
and uint_least64_t
must have the exact same range, are it would pretty much require malice on the implementor's part to not make them the exact same type.
P.S. Since this is tagged language-lawyer: there is no guarantee that uint64_t(1) << 32
still has type uint64_t
. Hypothetically, an implementation may provide a larger-than-64-bit int
type, in which case uint64_t
would be promoted to int
.
回答2:
There are specifiers for exactly this, using L
makes your integer literal a long
, LL
a long long
and ULL
an unsigned long long
, or, uint64_t
(most of the time).
Or just drop auto
all together and just let the compiler make the implicit cast.
来源:https://stackoverflow.com/questions/48909995/best-proper-way-to-define-uint64-t-constants