如何定义uint64_t常量?

时间:2018-07-21 05:50:48

标签: c++ c++14 qt-creator

我的C ++程序中有uint64_t常量(QtCreator 4.6.1中的clang 6.0.1)。

例如:

uint64_t a = 0xffffffffffffffffULL;

问题是,我在IDE中收到以下警告:

Warning: implicit conversion from 'unsigned long long' to 'uint64_t' (aka 'unsigned long')

我也尝试将其更改为以下内容,但没有成功:

uint64_t a = UINT64_C(0xffffffffffffffff);
uint64_t a = 0xffffffffffffffffUL;

我可以选择使用C ++ 14标准进行计算,并且可以选择:-Wconstant-conversion

检查类型大小:

std::cout << "uint64_t " << sizeof (uint64_t) << std::endl; 
std::cout << "unsigned long " << sizeof (unsigned long) << std::endl;
std::cout << "unsigned long long " << sizeof (unsigned long long) << std::endl;

结果:

uint64_t 8  
unsigned long 8
unsigned long long 8

有什么办法解决此问题以及IDE为什么认为正在进行大小转换吗?

编辑:我刚刚检查了宏扩展:

define UINT64_C(c)  c ## UL

这意味着所提供的示例应该可以使用,但是不能:

uint64_t a = 0xffffffffffffffffUL;

5 个答案:

答案 0 :(得分:3)

unsigned long long至少为64位,因此它可能比uint64_t

大。

我会写(请注意constexpr的使用,因为它是一个常量):

#include <cinttypes>
#include <limits>
constexpr auto a = std::numeric_limits<std::uint64_t>::max();

要以可移植的方式定义一个非max uint64_t常量,只需在最后删除ULL部分:

constexpr std::uint64_t b = 0x12345;

答案 1 :(得分:1)

由于@hvd评论,此警告已解决。

检查所有包含的头文件。由于某些原因,同时包含了namestdint.h。我只留下了cstdint。它们可能来自不同的平台,并且具有不同的定义。

工作示例:

cstdint

答案 2 :(得分:0)

编译器警告您在不能保证在C ++中具有相同大小的类型之间进行隐式转换。可能的解决方法是使其明确:

uint64_t a = static_cast<uint64_t>(0xffffffffffffffffULL);

答案 3 :(得分:0)

这是一种实现方式:

auto a = static_cast<uint64_t>(-1);

答案 4 :(得分:-1)

这里首先要注意的是,您不需要后缀LL

整数文字将自动具有可以容纳数字的类型。检出this表以获取确切类型。该规则的唯一例外是,如果您指定仅适合unsigned long long int的十进制文字。然后,您需要指定u后缀。

现在,可以通过强制转换轻松删除警告:

uint64_t a = (uint64_t)0xffffffffffffffff;

或者如果您不喜欢C转换,则使用static_cast

uint64_t a = static_cast<uint64_t>(0xffffffffffffffff);


到目前为止,这只是理论,但您的编译器/安装存在一些问题。如果您对此有隐式转换警告:

uint64_t a = 0xffffffffffffffffUL;

其中uint64_tunsigned long,则意味着0xffffffffffffffffUL实际上变成了unsigned long long int。但是不应该这样,因为sizeof(unsigned long)已经是8。如果编译器和安装正确,这显然是不可能的情况。