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
我正在学习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_ulong
和std::bitset::to_ullong
。
由内在数学运算引起的溢出不会被捕获,只会给您留下意想不到的结果。标准中没有定义确切的行为(很好的引用@AlexD的回答(。
- 条件断点在不应该触发时触发
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 为什么我不应该把所有东西都放在标题中?
- 找不到 QRegularExpression 行为的任何解释。它有效,但不应该
- 在清除 istream 之前,我不应该需要取消获取它吗?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- "typename"不应该只在模板函数或模板类中使用吗?
- 为不应该获得未定义行为的内容获取未定义的行为
- 两种情况下的输出不应该相同吗?
- 默认情况下,"std::shared_ptr"不应该使用"std::d efault_delete"吗?
- 错误代码 E0065 和 E0169 不应该有
- 矢量的值在不应该更改时更改
- 保证复制省略不应该适用吗?
- 不应该禁止访问私有类型吗?
- 使用匿名命名空间中的函数或另一个文件中的静态函数不应该出错吗?
- NRVO不应该保证局部命名变量和调用站点变量采用相同的地址吗?
- 类的私有成员在我的类实例化期间更改,即使他们不应该
- 为什么'system'不应该在 Windows 特定的应用程序中使用
- 正则表达式在我认为不应该在 c++ 中采用等号
- overflow_error在运行时捕获 C++ 当整数变量无法保存它不应该保存的值时