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

Best/proper way to define uint64_t constants

本文关键字:方法 最佳 uint64 常量 定义      更新时间:2023-10-16

constexpr auto v = static_cast<std::uint64_t>(1) << 32;并不理想,因为繁琐的语法和语义间接的强制转换。从这个线程中,我学到了constexpr auto v = UINT64_C(1) << 32;但是,宏的精确语义是

扩展为具有指定值的整数常量表达式 通过其参数和类型uint_least64_t.

因此,这并不完全是uint64_t.我想知道定义uint64_t常量的最佳/正确方法是什么。

请注意,unsigned long long不一定映射到uint64_t

更新

我不愿意使用函数式/C 风格的转换,因为有些人(例如,Google C++ Coding Style)说它来自 C,现代C++应该避免使用它们。看来我应该对此有自己的看法,而不是盲目跟随别人。

因此,它并不完全uint64_t。我想知道定义uint64_t常量的最佳/正确方法是什么。

如果你想绝对确定,你可以写uint64_t(1)(可能std::合格的)作为你static_cast的更短的替代品。

出于实际目的,UINT64_C很好。如果实现不提供任何满足其要求的类型,则不需要定义uint64_t。因此,根据uint_least64_t来定义UINT64_C是有意义的。

但是在确实存在uint64_t的实现上 - 并且你已经隐含地假设你正在使用这样的实现 -uint64_tuint_least64_t必须具有完全相同的范围,这几乎需要实现者的恶意,而不是使它们完全相同的类型。

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

正是有说明符的,使用L使您的整数文字成为longLLlong longULLunsigned long long,或者,uint64_t(大多数时候)。

或者只是auto一起删除,让编译器进行隐式强制转换。