无符号长长斐波那契数为负数?
Unsigned long long Fibonacci numbers negative?
我编写了一个简单的斐波那契数列生成器,如下所示:
#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
会变得太大吗?
您在此处 print(c, r);
进行了缩小转换,您将 print
定义为仅采用 int
,而此处您传递了 unsigned long long
。它是实现定义的。
引用 C++ 标准草案:
4.4.7:3: If the destination type is signed, the value is
unchanged if it can be represented in the destination type; otherwise,
the value is implementation-defined.
但通常发生的情况是:从 unsigned long long
中,只有刚好适合 int
的位被复制到您的函数中。 截断的 int
存储在Twos complements, depending on the value of the Most Significant Bit 中。你得到这样的交替。
更改函数签名以捕获 unsigned long long
void print(unsigned long long c, int r) {
std::cout << c << "\t\t" << r << std::endl;
}
顺便说一句,请参阅 你的问题。
我编写了一个简单的斐波那契数列生成器,如下所示:
#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
会变得太大吗?
您在此处 print(c, r);
进行了缩小转换,您将 print
定义为仅采用 int
,而此处您传递了 unsigned long long
。它是实现定义的。
引用 C++ 标准草案:
4.4.7:3: If the destination type is signed, the value is unchanged if it can be represented in the destination type; otherwise, the value is implementation-defined.
但通常发生的情况是:从 unsigned long long
中,只有刚好适合 int
的位被复制到您的函数中。 截断的 int
存储在Twos complements, depending on the value of the Most Significant Bit 中。你得到这样的交替。
更改函数签名以捕获 unsigned long long
void print(unsigned long long c, int r) {
std::cout << c << "\t\t" << r << std::endl;
}
顺便说一句,请参阅