-2

我编写了一个简单的斐波那契序列生成器,如下所示:

#include <iostream>

void print(int c, int r) {
    std::cout << c << "\t\t" << 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整数怎么了?

即使是整数c也会变得太大吗?long long

4

1 回答 1

6

您在此处进行了缩小转换print(c, r);,您定义print为仅采用int's,而在这里您传递了unsigned long long. 它是实现定义的。

引用 C++ 标准草案:

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

但通常发生的情况是:从 中unsigned long long,只有刚好适合 an 的位int被复制到您的函数中。根据最高有效位的值,截断值以 二进制补码int形式存储。你得到这样的交替。

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

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

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

于 2016-06-02T05:38:30.867 回答