检查unsigned long long overflow

时间:2015-10-19 21:02:49

标签: c overflow long-integer unsigned addition

我正在尝试生成斐波纳契数,我将它们存储为无符号长long。但是,如果系列中的新数字大于unsigned long long可以容纳的数字,我希望停止生成更多数字。我目前有以下内容。

unsigned long long n1 = 1, n2 = 1, n3;
    int i;
    for(i = 0; i < n; i++) {
        if(i == 0 || i == 1) {
            fprintf(fibonacci_file, "%lld\n", n1);
        }else {
            n3 = n1 + n2;
            if(n3 < n1) {
                printf("FIBONACCI OVERFLOW\n");
                break;
            }else {
                fprintf(fibonacci_file, "%lld\n", n3);
                n1 = n2;
                n2 = n3;
            }
        }
    }

然后输出文件的结尾如下所示。

1100087778366101931
1779979416004714189
2880067194370816120
4660046610375530309
7540113804746346429
-6246583658587674878

最后一个是否定的,意味着结果溢出。但是我的检查应该抓住它而不打印出来,然后结束循环。

1 个答案:

答案 0 :(得分:2)

用于打印全范围unsigned long long的错误说明符。使用"%llu"@void_ptr

unsigned long long n3;
....
// fprintf(fibonacci_file, "%lld\n", n3);
fprintf(fibonacci_file, "%llu\n", n3);
OP的检测溢出的方法很好,如C中所示,数学溢出很好地定义为简单的&#34; wrap&#34;。这是伪代码:unsigned_sum = math_sum mod (UMAX+1)给出所涉及类型的最大值。

 if (n3 < n1) {
   printf("FIBONACCI OVERFLOW\n");
   break;

删除的讨论还提出了一个惯用的测试@Weather Vane@Olaf也可以。当涉及的类型不是无符号整数,而是有符号整数或浮点时,此方法很有用。

 if (ULLONG_MAX - n2 < n1) {
   printf("FIBONACCI OVERFLOW\n");
   break;
 }
 n3 = n1 + n2;

此外,该系列有时被视为从F[0] = 0开始。见Fibonacci number