Беззнаковые длинные длинные числа Фибоначчи отрицательные?
Я написал простой генератор последовательности Фибоначчи, который выглядит так:
#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
целое число?
1 ответ
У вас есть сужение конверсии здесь print(c, r);
где вы определили print
взять только int
и здесь вы передаете unsigned long long
, Это реализация определяется.
Цитирование проекта стандарта C++:
4.4.7: 3: если тип назначения подписан, значение не изменяется, если оно может быть представлено в типе назначения; в противном случае значение определяется реализацией.
Но обычно происходит следующее: от unsigned long long
только биты, которых достаточно, чтобы вписаться в int
скопированы в вашу функцию. Усеченный int
хранится в дополнениях Twos, в зависимости от значения старшего бита. Вы получаете такое чередование.
Измените свою подпись функции, чтобы захватить unsigned long long
void print(unsigned long long c, int r) {
std::cout << c << "\t\t" << r << std::endl;
}
Кстати, см . Комментарий Мохита Джайна к вашему вопросу.