我有斐波那契递归函数:
int efib (int num) {
if (num == 0){
return 0;
}else if (num == 1){
return 1;
}else if (num == -1){
return -1;
}else if (num > 0){
return efib(num - 1) + efib (num - 2);
}else{
return efib (num + 1) + efib(num + 2);
}
}
我正在尝试查找num
值溢出的确切元素int
,是否有可能获得当前递归值以将其与int
数据的最大值进行比较类型可以容纳吗?
我知道斐波那契数列中一个int可以容纳的最大值为1836311903。
答案 0 :(得分:0)
我正在尝试查找int值溢出的确切元素(num)
为防止溢出,在添加之前将2个操作数传递给OF test function。
它使用“将其与int数据类型可以容纳的最大值进行比较”。
#include <limits.h>
int is_undefined_add1(int a, int b) {
return (a < 0) ? (b < INT_MIN - a) : (b > INT_MAX - a);
}
....
// return efib(num - 1) + efib (num - 2);
int a = efib(num - 1);
int b = efib(num - 2);
if (is_undefined_add1(a, b)) {
fprintf(stderr, "fib[%d] was about to overflow\n", num);
exit(EXIT_FAILURE);
}
return a + b;
如果有更广泛的类型(long
,long long
或intmax_t
),则可以通过该类型进行简单加法,并在int
范围内检查总和。 @Barmar
#if LLONG_MAX/2 >= INT_MAX && LLONG_MIN/2 <= INT_MIN
int is_undefined_add1(int a, int b) {
long long sum = a;
sum += b;
return sum < INT_MIN || sum > INT_MAX;
}
#else
// as above
#endif