1. std::numeric_limits 类型对应最值查询
C++ 工具库 类型支持 std::numeric_limits
定义于头文件
template< class T > class numeric_limits;
numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits::max() )。
通过 numeric_limits 模板的特化提供此信息。标准库为所有算术类型制定可用的特化:
定义于头文件
template<> class numeric_limits<bool>;
template<> class numeric_limits<char>;
template<> class numeric_limits<signed char>;
template<> class numeric_limits<unsigned char>;
template<> class numeric_limits<wchar_t>;
template<> class numeric_limits<char8_t>;
(C++20 起)
template<> class numeric_limits<char16_t>;
(C++11 起)
template<> class numeric_limits<char32_t>;
(C++11 起)
template<> class numeric_limits<short>;
template<> class numeric_limits<unsigned short>;
template<> class numeric_limits<int>;
template<> class numeric_limits<unsigned int>;
template<> class numeric_limits<long>;
template<> class numeric_limits<unsigned long>;
template<> class numeric_limits<long long>;
template<> class numeric_limits<unsigned long long>;
template<> class numeric_limits<float>;
template<> class numeric_limits<double>;
template<> class numeric_limits<long double>;
亦对所有整数类类型提供特化。
2. (C++20 起)
另外,对于每个存在特化的 cv 无限定类型的每个 cv 限定版本存在特化,等同于非限定的特化,例如提供 std::numeric_limits 、 std::numeric_limits 和 std::numeric_limits ,且它们等价于 std::numeric_limits 。
作为算术类型别名的标准库类型(例如 std::size_t 或 std::streamsize )也可以用 std::numeric_limits 类型特性检测。
非算术标准类型,例如 std::complex 或 std::nullptr_t ,无特化。
实现可以对实现指定的类型提供 std::numeric_limits 的特化:例如 GCC 提供 std::numeric_limits<__int128> 。非标准库可以为库所提供的类型添加特化,例如 OpenEXR 为 16 位浮点类型提供 std::numeric_limits 。
3. 示例
#include <limits>
#include <iostream>
int main()
{
std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";
std::cout << "uchar\t"
<< +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
<< +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
<< +std::numeric_limits<unsigned char>::max() << '\n';
std::cout << "int\t"
<< std::numeric_limits<int>::lowest() << '\t'
<< std::numeric_limits<int>::min() << '\t'
<< std::numeric_limits<int>::max() << '\n';
std::cout << "float\t"
<< std::numeric_limits<float>::lowest() << '\t'
<< std::numeric_limits<float>::min() << '\t'
<< std::numeric_limits<float>::max() << '\n';
std::cout << "double\t"
<< std::numeric_limits<double>::lowest() << '\t'
<< std::numeric_limits<double>::min() << '\t'
<< std::numeric_limits<double>::max() << '\n';
}
可能的输出:
type lowest() min() max()
uchar 0 0 255
int -2147483648 -2147483648 2147483647
float -3.40282e+38 1.17549e-38 3.40282e+38
double -1.79769e+308 2.22507e-308 1.79769e+308