overflow_error在运行时捕获 C++ 当整数变量无法保存它不应该保存的值时

Is overflow_error caught at runtime in C++ when a integer variable cannot hold a value that it is not supposed to

本文关键字:保存 不应该 变量 整数 error 运行时 C++ overflow      更新时间:2023-10-16

我正在学习C++,我试图编写这个函数来找到可以适合整数类型的最大斐波那契整数:

void findFibThatFitsInAnInt()
{
    int n1 = 1;
    int n2 = 1;
    int fib = 0;
    try
    {
        while ( true )
        {
            fib = n1 + n2;
            n1 = n2;
            n2 = fib;
            cout << "Fibonacci number : " << fib << "n";
        } 
    }
    catch (overflow_error & e)
    {
        cout << "The largest fib that can fit into an int is : " << fib << "n";
        cout << e.what() << "n";
    }
    cout << "The largest fib that can fit into an int is : " << n1 << "n";
}

但问题是overflow_error根本没有被抓住。我知道其他方法:

我知道我可以这样写:

while ( fib >= 0 )
        {
            fib = n1 + n2;
            n1 = n2;
            n2 = fib;
            cout << "Fibonacci number : " << fib << "n";
        } 

而且因为FIB只是一个"int"而不是一个无符号的int,当它被分配一个大于int类型容量的值时,它最终会变成<0(奇怪的是(。

问题是:overflow_error在运行时捕获此类容量问题是否C++?我对overflow_error有什么误解吗?这是我从我的谷歌foo中知道的:

定义要作为异常引发的对象类型。它可用于 报告算术溢出错误(即,结果 的计算对于目标类型来说太大(

如果整数溢出忽略overflow_error有没有办法为我的 c++ 编译器启用它(Visual Studio 2013?

简短回答:否。 C 和 C++ 都不会在运行时自动检测整数溢出。

以下是有关 C++ std::overflow_error 的更多详细信息:

http://en.cppreference.com/w/cpp/error/overflow_error

std::overflow_error 在标头 <stdexcept> 中定义

定义要作为异常引发的对象类型。它可用于 报告算术溢出错误(即,结果 的计算对于目标类型来说太大(

引发此异常的唯一标准库组件是 std::bitset::to_ulong 和 std::bitset::to_ullong。

标准库组件的数学函数没有 抛出此异常(数学函数将溢出错误报告为 在 math_errhandling( 中指定。但是,第三方库使用 这。例如,boost.math 抛出 std::overflow_error if 启用 boost::math::p olicies::throw_on_error(默认值 设置(。

下面是有关可以在代码中执行哪些操作来检测和处理整数溢出的详细信息:

如何检测整数溢出?

根据标准(强调我的(:

5 表达式 [expr]
....

如果在表达式求值期间,结果未在数学上定义或不在其类型的可表示值,行为未定义。[ 注意大多数现有的C++实现忽略整数溢出

附言顺便说一句,请注意

3.9.1 基本类型

(脚注(
无符号算术不会溢出,因为结果不能用结果表示无符号整数类型是归数,该数字大于 1 可表示的最大值生成的无符号整数类型。

对于此类容量问题overflow_error是否在 C++ 的运行时捕获?

否,从文档中获取

引发此异常的唯一标准库组件是 std::bitset::to_ulongstd::bitset::to_ullong

由内在数学运算引起的溢出不会被捕获,只会给您留下意想不到的结果。标准中没有定义确切的行为(很好的引用@AlexD的回答(。