C++ 从 istream 中读取 int,检测溢出

12 浏览
0 Comments

C++ 从 istream 中读取 int,检测溢出

如果我使用>>运算符从istream中读取一个整数,并且表示的整数大于INT_MAX,那么操作将返回INT_MAX。

目前我正在与INT_MAX进行比较以检测溢出,但是如果操作输入了“2147483647”,那么当实际上没有错误且结果有效时,将返回错误。

示例:http://ideone.com/4bXyGd

#include 
#include 
#include 
int main() {
    std::istringstream st("1234567890123"); // 尝试使用2147483647
    int result;
    st >> result;
    if (result == INT_MAX)
        std::cout << "溢出!" << std::endl;
    else
        std::cout << result << std::endl;
    return 0;
}

在意识形态上,正确的做法是什么?

0
0 Comments

C++中从istream中读取int类型数据时,可能会出现溢出的问题。在C++11之前,只能通过检查fail bit来判断是否出现了解析错误,但无法具体判断是否溢出。而在C++11中,如果解析出的值过大或过小,除了设置fail bit之外,还会将结果设置为对应类型所能容纳的最大值或最小值。因此,在C++11中,可以通过以下方法来判断值是否溢出:

if (!st) {
    if (result == std::numeric_limits::max()) {
        std::cout << "Overflow!" << std::endl;
    } else if (result == std::numeric_limits::min()) {
        std::cout << "Underflow!" << std::endl;
    } else {
        std::cout << "Some other parse error" << std::endl;
    }
}

以上代码中,先通过检查fail bit来判断是否解析错误,然后通过与std::numeric_limits::max()和std::numeric_limits::min()进行比较,来判断是否溢出。如果result等于std::numeric_limits::max(),则表示溢出;如果result等于std::numeric_limits::min(),则表示下溢;否则,表示其他解析错误。

通过以上方法,可以在C++中读取int类型数据时,检测是否发生溢出,并据此进行相应的处理。

0
0 Comments

C++从istream读取int类型数据时,可能会遇到溢出的问题。为了解决这个问题,我们可以先将输入的值以字符串的形式读取,然后将其转换为整型。在转换过程中,我们可以判断这个值是否在目标类型的范围内。

为了实现这个功能,可以使用boost库中的lexical_cast函数。该函数在值无法转换为目标类型时会抛出异常。

如果我们先将输入的值读取为字符串,那么我们可以直接与目标类型的最大值进行字符串比较,以判断是否溢出。

0