我写了一个简单的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
是否会变得过大?
答案 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您的问题。