【问题标题】:Unsigned long long Fibonacci numbers negative?无符号长长斐波那契数为负数?
【发布时间】:2016-06-02 05:34:34
【问题描述】:

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

#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 整数是怎么回事?

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

【问题讨论】:

  • 所以您打算将第 1000 个斐波那契数存储在(可能)64 位数字中?第千Fibonacci数FYI是:43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875.应使用一些自定义BIGINT数据类型跨度>
  • 如果这是一个选项,python 是一个不错的语言选择,因为它具有内置的 bigint 支持。

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


【解决方案1】:

你在这里有一个缩小转换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;
}

顺便说一句,请参阅Mohit Jain's comment 你的问题。

【讨论】:

  • @user6245072 为了不觉得自己愚蠢,你应该开始阅读编译器警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2014-11-09
  • 2014-05-19
  • 2015-06-05
  • 2014-05-23
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多