Беззнаковые длинные длинные числа Фибоначчи отрицательные?

Я написал простой генератор последовательности Фибоначчи, который выглядит так:

#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;
}

Кстати, см . Комментарий Мохита Джайна к вашему вопросу.

Другие вопросы по тегам