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

时间:2016-06-02 05:34:35

标签: c++ unsigned-integer negative-integer

我写了一个简单的Fibonacci序列生成器,看起来像:

#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是否会变得过大?

1 个答案:

答案 0 :(得分:6)

您在此处print(c, r);缩小转化,您定义print只需int个,然后传递unsigned long long。它是实现定义。

引用C ++标准草案:

  

4.4.7:3:如果目标类型已签名,则值为   如果它可以在目的地类型中表示,则不变;除此以外,   该值是实现定义的。

但通常会发生的是:从unsigned long long开始,只有恰好适合int的位才会复制到您的函数中。 截断 int存储在Twos complements中,具体取决于Most Significant Bit的值。你得到了这样的改变。

更改您的功能签名以捕获unsigned long long

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

BTW,请参阅Mohit Jain's comment您的问题。