std::numeric_limits\<T>的min、max和lowest在C++中的区别
如果你是一名C++程序员,你肯定会使用过std::numeric_limits
这个模板类。它提供了一些非常方便的方法来访问基本数据类型的一些特性,比如数据类型的最大值、最小值、处理过程的精度等等。
其中,std::numeric_limits<T>::min()
、std::numeric_limits<T>::max()
和std::numeric_limits<T>::lowest()
这三个成员函数是非常重要的,也经常被混淆。今天,我们来仔细看一下这三个成员函数之间的区别。
std::numeric_limits<T>::min()
首先,让我们来看一下std::numeric_limits<T>::min()
这个函数。它返回的是类型T
的最小正值。也就是说,如果T
是一个有符号整数类型,那么它返回的就是1
,如果T
是一个浮点数类型,那么就返回std::numeric_limits<T>::epsilon()
,这是类型T
能够表示的最小正数。
下面是一个示例程序:
#include <iostream>
#include <limits>
int main() {
std::cout << "char min value: " << static_cast<int>(std::numeric_limits<char>::min()) << '\n'; // -128
std::cout << "unsigned char min value: " << static_cast<unsigned int>(std::numeric_limits<unsigned char>::min()) << '\n'; // 0
std::cout << "float min value: " << std::numeric_limits<float>::min() << '\n'; // 1.17549e-38
std::cout << "double min value: " << std::numeric_limits<double>::min() << '\n'; // 2.22507e-308
return 0;
}
在这个程序中,我们使用了std::numeric_limits<T>::min()
来获取不同类型的最小值。在有符号的字符类型以及浮点数类型中,返回的值都是正值。而对于无符号类型,返回的值总是0
。
std::numeric_limits<T>::max()
接下来,让我们来看一下std::numeric_limits<T>::max()
这个函数。它返回的是类型T
的最大值。不管是有符号还是无符号,整数还是浮点数,返回的都是类型T
能够表示的最大值。
下面是一个示例程序:
#include <iostream>
#include <limits>
int main() {
std::cout << "char max value: " << static_cast<int>(std::numeric_limits<char>::max()) << '\n'; // 127
std::cout << "unsigned char max value: " << static_cast<unsigned int>(std::numeric_limits<unsigned char>::max()) << '\n'; // 255
std::cout << "int max value: " << std::numeric_limits<int>::max() << '\n'; // 2147483647
std::cout << "float max value: " << std::numeric_limits<float>::max() << '\n'; // 3.40282e+38
std::cout << "double max value: " << std::numeric_limits<double>::max() << '\n'; // 1.79769e+308
return 0;
}
如上述示例中,我们使用了std::numeric_limits<T>::max()
来获取不同类型的最大值,在这些类型中,返回的值是它们能够表示的最大值。
std::numeric_limits<T>::lowest()
接下来,让我们来看一下std::numeric_limits<T>::lowest()
这个函数。它返回的是类型T
的最小值,但与std::numeric_limits<T>::min()
不同,std::numeric_limits<T>::lowest()
返回的是类型T
的最小负数。因此它只对有符号类型有效。返回的是类型T
能够表示的最小值下的数字。
下面是一个示例程序:
#include <iostream>
#include <limits>
int main() {
std::cout << "char lowest value: " << static_cast<int>(std::numeric_limits<char>::lowest()) << '\n'; // -128
std::cout << "int lowest value: " << std::numeric_limits<int>::lowest() << '\n'; // -2147483648
std::cout << "float lowest value: " << std::numeric_limits<float>::lowest() << '\n'; // -3.40282e+38
std::cout << "double lowest value: " << std::numeric_limits<double>::lowest() << '\n'; // -1.79769e+308
return 0;
}
在这个程序中,我们可以看到对于有符号类型(如char
和int
),std::numeric_limits<T>::lowest()
返回的是类型T
所能表示的最小负数。而在浮点数类型中,这个函数返回的是负无穷大。
需要注意的是,在IEEE 754标准中,浮点数类型有一个特殊的值——负无穷大和正无穷大(-inf
和+inf
)。当浮点数的绝对值大到无法用该类型的范围内表示时,就会出现这样的情况。
lowest()
和min()
之间的区别
现在我们来看一下lowest()
和min()
之间的区别。
首先,min()
和lowest()
都被用来获取某个类型的最小值。但它们分别返回这个最小值可表示的最小正数和最小负数。因此,当T
是一个无符号类型的时候,min()
和lowest()
返回的值是相同的。
其次,lowest()
只对有符号类型有效,而min()
对所有数据类型都有效。
下面是一个示例程序,展示了min()
和lowest()
之间的区别:
#include <iostream>
#include <limits>
int main() {
std::cout << "char min value: " << static_cast<int>(std::numeric_limits<char>::min()) << '\n'; // -128
std::cout << "char lowest value: " << static_cast<int>(std::numeric_limits<char>::lowest()) << '\n'; // -128
std::cout << "unsigned char min value: " << static_cast<int>(std::numeric_limits<unsigned char>::min()) << '\n'; // 0
std::cout << "unsigned char lowest value: " << static_cast<int>(std::numeric_limits<unsigned char>::lowest()) << '\n'; // 0
std::cout << "float min value: " << std::numeric_limits<float>::min() << '\n'; // 1.17549e-38
std::cout << "float lowest value: " << std::numeric_limits<float>::lowest() << '\n'; // -3.40282e+38
return 0;
}
在上述示例中,我们可以看到当类型为无符号类型时,min()
和lowest()
返回值一样。而当类型为有符号类型时,它们返回的值不同。
结论
在C++中,std::numeric_limits<T>::min()
、std::numeric_limits<T>::max()
和std::numeric_limits<T>::lowest()
函数是非常常用的,它们用于获取特殊数据类型的最大值、最小值和最小负数。需要注意的是,对于浮点数类型,lowest()
返回的是负无穷大,这是这个类型所能表示的最小负数。