如何定义uint64_t常量? 我在C++程序中有Unt64的常数(QtC造饰者4.6-1中的CLAN.60.1)。

如何定义uint64_t常量? 我在C++程序中有Unt64的常数(QtC造饰者4.6-1中的CLAN.60.1)。,c++,c++14,qt-creator,C++,C++14,Qt Creator,例如: 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;

例如:

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;
你知道如何解决这个问题吗?为什么IDE认为正在发生大小转换

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

define UINT64_C(c)  c ## UL
这意味着提供的示例应该可以工作,但它不能:

uint64_t a = 0xffffffffffffffffUL;

unsigned long long
至少为64位,因此它可能比
uint64\t

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


<>编译器警告你在C++中不保证大小相同的类型之间的隐式转换。一个可能的解决方案是使其明确:

uint64_t a = static_cast<uint64_t>(0xffffffffffffffffULL);
uint64\u t a=静态强制转换(0xfffffffffffffull);

这是一种方法:

auto a = static_cast<uint64_t>(-1);
auto a=static\u cast(-1);

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

整型文字将自动具有一个可以保存数字的类型。查看表中的确切类型。此规则的唯一例外是,如果指定的十进制文字仅适用于
无符号long long int
。然后需要指定
u
后缀

现在,可以通过石膏轻松移除警告:

uint64_t a=(uint64_t)0xffffffffffffff

或者,如果您不喜欢C cast,则使用
静态\u cast

uint64\u t a=静态强制转换(0xffffffffffffffff)


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

uint64\u t a=0xfffffffffffful


如果
uint64\u t
无符号长
,则表示
0xfffffffffffful
实际上变为
无符号长整型
。但它不应该是,因为
sizeof(unsigned long)
已经是8了。如果编译器和安装正确,这显然是不可能的情况。

由于@hvd comment,此警告得以解决

已检查所有包含的头文件。出于某种原因,包括了
stdint.h
cstdint
。我只留下了
cstdint
。它们可能来自不同的平台,有不同的定义

工作示例:

uint64_t v0 = UINT64_C(0x736f6d6570736575);

答案就在你的警告信息中!仔细阅读。可能相关:,@Someprogrammerdude-是的,我试过了。用示例更新了问题。不,答案不在警告中。@Ross如果编译器将
0xfffffffffffffful
视为
无符号长
常量(因为您说错误仍然是“从“无符号长
转换”),则
无符号长
类型没有64位。如果您的头仍然将
uint64\u t
定义为
无符号long
,那么一定是出了严重问题。您是否无意中使用了其他平台的标题?但是,这与测试程序的输出不匹配。@hvd这似乎确实是混合头的问题。我试图复制另一个文件中的定义,但警告没有显示在其中。等于或更大。64位,不是字节。取决于数据模型:。如何以可移植的方式定义非最大常量?@bit\u data\u为字节->位创建了一个很好的捕获模型。你说的相等或更大是什么意思?我在回答中说“至少”,这与等于或大于相同。不?宏是邪恶的,几乎不需要。如果只包含
stdint.h
会发生什么?或者如果只有
cstdint
?据推测,对于其中一种情况,您将得到相同的虚假警告(如果两者都包括在内,这应该不是问题)。“它们可能来自不同的平台,具有不同的定义。”:这意味着您的安装不正确。
uint64_t a = static_cast<uint64_t>(0xffffffffffffffffULL);
auto a = static_cast<uint64_t>(-1);
uint64_t v0 = UINT64_C(0x736f6d6570736575);