C++ 从 istream 中读取 int,检测溢出
C++ 从 istream 中读取 int,检测溢出
如果我使用>>运算符从istream中读取一个整数,并且表示的整数大于INT_MAX,那么操作将返回INT_MAX。
目前我正在与INT_MAX进行比较以检测溢出,但是如果操作输入了“2147483647”,那么当实际上没有错误且结果有效时,将返回错误。
#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; }
在意识形态上,正确的做法是什么?
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
通过以上方法,可以在C++中读取int类型数据时,检测是否发生溢出,并据此进行相应的处理。