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整数?
你在这里有一个缩小的转换,在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对你的问题的评论.