包含头文件
<limits>
并调用
std::numeric_limits<uint64_t>::max()
可以解决这个问题,但以下是使用
类型转换的最简单实现方式,以防你忘记了
std::numeric_limits<uint64_t>::max()
的拼写。(健忘症实际上可能发生在你们所有人身上!...在过去或将来的某个时刻...)
- 注意:这种方法的可用性取决于你的语言版本如何处理负值。"二进制补码"是2023年左右的问题...但如果你还没有尝试过,你必须试一试。
它写道:
uint64_t(-1) // functional notation
或者
(uint64_t)-1 // c-like cast notation
例如,您可以像这样打印其最大值的确切值:
#include <iostream>
int main() {
std::cout << "max value = " << uint64_t(-1);
}
输出的结果是:
max value = 18446744073709551615
看这里!
==== 以下有更多阅读内容 ====
事实上,许多编译器头文件使用这种类型转换作为那些预定义的“limits”宏的值。例如,在我的macOS开发环境中,使用XCode和g++,我的C++头文件limits.h中说,在template <class _Type, bool = is_arithmetic<_Type>::value> class __libcpp_numeric_limits
内:
static constexpr const bool is_signed = _Type(-1) < _Type(0);
这是一种聪明的检查有符号和无符号类型的方法。然后,
static constexpr const _Type __min = __libcpp_compute_min<_Type, digits, is_signed>::value;
static constexpr const _Type __max = is_signed ? _Type(_Type(~0) ^ __min) : _Type(~0);
最小值使用了一个涉及特殊模板的计算方法,而最大值则使用了is_signed结果。最小值的模板如下:
template <class _Type, int __digits, bool _IsSigned>
struct __libcpp_compute_min {
static constexpr const _Type value = _Type(_Type(1) << __digits);
};
这个表达与你问题中的表达式 (1<<64)-1
相似,只是没有了 -1
部分。
试试在你自己的电脑上检查限制头文件,看看它说了什么!
#define __STDC_LIMIT_MACROS
是什么,但你可能想在包含头文件之前定义它,而不是在使用UINTwhatever
之前。 - Luchian Grigorestd::numeric_limits<uint64_t>::max()
不行吗? - Igor R.numeric_limits
特化,尽管很有可能会有一个。不过,如果没有constexpr
,max()
的用处就较小了。 - pmrstd::numeric_limits<uint64_t>::max()
解决了问题。谢谢。如果你愿意,你可以把它作为答案。 - Subway#ifndef UINT64_MAX #define UINT64_MAX 18446744073709551615
,附带相应的后缀(如果不支持ull
,则可能是ui64
)。 - M.M