无符号长长斐波那契数负数

Unsigned long long Fibonacci numbers negative?

本文关键字:无符号      更新时间:2023-10-16

我写了一个简单的斐波那契序列生成器,看起来像:

#include <iostream>
void print(int c, int r) {
    std::cout << c << "tt" << r << std::endl;
}
int main() {
    unsigned long long int a = 0, b = 1, c = 1;
    for (int r = 1; r <= 1e3; r += 1) {
        print(c, r);
        a = b;
        b = c;
        c = a + b;
    }
}

然而,当r接近 40 的值时,奇怪的事情开始发生。 c的值在负值和正值之间振荡,尽管他是一个unsigned整数,当然斐波那契数列不可能完全是这样。

unsigned long long整数是怎么回事?

即使对于long long整数,c也会变得太大吗?

您在这里有一个缩小的转换,print(c, r);您定义print只取int,在这里您传递了一个unsigned long long。它是实现定义的。

引用C++标准草案:

4.4.7:3:如果目标类型是有符号的,则值为 如果可以在目标类型中表示,则保持不变;否则 该值是实现定义的。

但通常的情况是:从unsigned long long,只有刚好足以适应int的位才会复制到你的函数中。截断的int存储在二进制补码中,具体取决于最高有效位的值。你会得到这样的交替。

更改函数签名以捕获unsigned long long

void print(unsigned long long c, int r) {
    std::cout << c << "tt" << r << std::endl;
}

顺便说一句,请参阅Mohit Jain对您的问题的评论。