定义uint64_t常量的最佳/正确方法

时间:2018-02-21 15:46:34

标签: c++ c++11 language-lawyer constants literals

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 ++应该避免使用它们。看起来我应该对此有自己的看法,而不是盲目跟随别人。

2 个答案:

答案 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_tuint_least64_t必须具有完全相同的范围,是否真的需要实施者的恶意,而不是使它们完全相同。

P.S。由于这是标记的语言律师:无法保证uint64_t(1) << 32仍然具有uint64_t类型。假设一个实现可能提供大于64位的int类型,在这种情况下uint64_t将被提升为int

答案 1 :(得分:-2)

有完全相同的说明符,使用L使您的整数文字为longLLlong longULLunsigned long long ,或uint64_t(大部分时间)。

或者只是将auto全部放在一起,让编译器进行隐式转换。