gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:48 25 4
gpt4 key购买 nike

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

我目前正在与 INT_MAX 进行比较以检测溢出,但如果输入操作“2147483647”,那么它会返回一个错误,而实际上没有错误,结果是有效的。

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

#include <iostream>
#include <sstream>
#include <climits>

int main() {
std::istringstream st("1234567890123"); // Try with 2147483647
int result;

st >> result;

if (result == INT_MAX)
std::cout << "Overflow!" << std::endl;
else
std::cout << result << std::endl;

return 0;
}

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

最佳答案

对于一般的解析失败(包括数字太大或太小),您可以简单地检查 fail bit已设置字符串流。最简单的方法是:

if (!st) {
std::cout << "Could not parse number" << std::endl;
}

在 C++11 之前,无法使用此方法专门检查溢出或下溢。但是在 C++11 中,如果解析的值对于类型来说太大或太小,结果将被设置为该类型可以容纳的最大值( std::numeric_limits<Type>::max()std::numeric_limits<Type>::min() ),除了失败位被设置。

所以在 C++11 中检查值是太大还是太小你可以这样做:

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

关于C++从istream读取int,检测溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17116690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com