std::numeric_limits\的min、max和lowest在C++中的区别

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;
}

在这个程序中,我们可以看到对于有符号类型(如charint),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()返回的是负无穷大,这是这个类型所能表示的最小负数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程