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

use*_*072 -2 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当r价值达到40左右时,奇怪的事情开始发生.c尽管他是一个unsigned整数,但它的价值在负面和正面之间振荡,当然斐波纳契序列不可能就是这样.

这是怎么回事用unsigned long long整数?

是否c得到过大,即使是long long整数?

Whi*_*TiM 6

你在这里有一个缩小的转换,在print(c, r);那里你定义print只采取ints,你在这里通过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 << "\t\t" << r << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,看看Mohit Jain对你的问题的评论.