使用UINT64_C的目的?

时间:2018-09-25 03:35:59

标签: c++ macros

我在升压源中发现了这一行:

const boost::uint64_t m = UINT64_C(0xc6a4a7935bd1e995);

我想知道在这里使用MACRO的目的是什么?

这是将ULL添加到提供的常量中。

我认为使用它可能使人们更容易犯错误而不是使用UL来键入ULL,但是我想知道是否还有其他理由使用它。

1 个答案:

答案 0 :(得分:8)

如果查看boost/cstdint.h,您会发现UINT64_C宏的定义在不同的平台和编译器上是不同的。

在某些平台上,其定义为value##uL,在其他平台上,其定义为value##uLL,在其他平台上,其定义为value##ui64。这完全取决于该平台上unsigned longunsigned long long的大小或编译器特定扩展的存在。

在那种情况下,我认为实际上不需要使用UINT64_C,因为文字0xc6a4a7935bd1e995已经被解释为64位无符号整数。但是,在其他情况下这是必要的。例如,如果here文字0x00000000ffffffff未被使用UINT64_C专门指定为64位无符号整数,则它将被解释为32位无符号整数(尽管我认为按位与运算将其提升为uint64_t

无论如何,显式声明字面量的大小在代码声明中起着重要的作用。有时,即使某种操作完全由该语言很好地定义了,对于人类程序员来说也可能很难分辨出所涉及的类型。明确地说出它可以使代码更容易推理,即使它没有直接改变程序的行为。