如何定义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);