gpt4 book ai didi

检查 unsigned long long 溢出

转载 作者:太空宇宙 更新时间:2023-11-04 07:05:40 24 4
gpt4 key购买 nike

我正在尝试生成斐波那契数,并将它们存储为无符号长整型。但是,如果系列中的新数字大于 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

最后一个为负数,表示结果溢出。然而,我的支票本应该捕获它而不是打印出来,然后结束循环。

最佳答案

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

unsigned long long n3;
....
// fprintf(fibonacci_file, "%lld\n", n3);
fprintf(fibonacci_file, "%llu\n", n3);

OP 检测溢出的方法与在 C 中一样好,数学溢出被明确定义为简单的“换行”。这是伪代码:unsigned_sum = math_sum mod (UMAX+1) 给定所涉及类型的最大值。

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

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

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

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

关于检查 unsigned long long 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33223864/

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