constexpr auto v = static_cast<std::uint64_t>(1) << 32;
并不理想,因为语法繁琐,而且语义上是间接的。从this主题开始,我学到了constexpr auto v = UINT64_C(1) << 32;
但是,macro的精确语义是
扩展为具有指定值的整数常量表达式 通过其参数和类型
uint_least64_t
。
因此,它并不完全是uint64_t
。我想知道定义uint64_t
常量的最佳/正确方法是什么。
请注意,unsigned long long
不一定映射到uint64_t
。
更新
我不愿意使用功能/ C风格的强制转换,因为有些(例如Google C ++编码风格)说它来自C,而现代C ++应该避免使用它们。看起来我应该对此有自己的看法,而不是盲目跟随别人。
答案 0 :(得分:3)
因此,它并不完全是
uint64_t
。我想知道定义uint64_t
常量的最佳/正确方法是什么。
如果您想完全确定,可以写uint64_t(1)
(可能是std::
- 合格)作为static_cast
的缩写替代。
出于实际目的,UINT64_C
很好。如果uint64_t
没有提供符合其要求的任何类型,则无需实施。{1}}因此,根据UINT64_C
来定义uint_least64_t
是有道理的。
但是在uint64_t
确实存在的实施中 - 并且您已经隐含地假设您正在使用此类实施 - uint64_t
和uint_least64_t
必须具有完全相同的范围,是否真的需要实施者的恶意,而不是使它们完全相同。
P.S。由于这是标记的语言律师:无法保证uint64_t(1) << 32
仍然具有uint64_t
类型。假设一个实现可能提供大于64位的int
类型,在这种情况下uint64_t
将被提升为int
。
答案 1 :(得分:-2)
有完全相同的说明符,使用L
使您的整数文字为long
,LL
为long long
和ULL
为unsigned long long
,或uint64_t
(大部分时间)。
或者只是将auto
全部放在一起,让编译器进行隐式转换。