Почему не считается без numeric _limits?

Начал изучать c++ и дали задание посчитать сумму арифметической прогрессии (от 1 до n). Сказали исправить уже существующий код, потому что он считает не все числа до 4 * 10^9 степени. Я заменил int на long long int, но ответ выходил отрицательный, но почему-то если вычитать результат из предела значения long long ( и + 1), то ответ выдает правильный. Отсюда вопрос, почему?, ведь long long больше чем результат суммы арифметической прогрессии.

#include <iostream>

int main() {
    int n; / заменено на long long int n
    std::cin >> n;
    std::cout << n * (n + 1) / 2 << "\n"; / заменено на std::cout << std::numeric_limits<long long>::max() + n * (n + 1ll) / 2ll + 1;
}

Ответы (1 шт):

Автор решения: Harry
long long int n;
std::cin >> n;
std::cout << (n%2 ? (n+1)/2*n : n/2*(n+1)) << std::endl;

Ну, или использовать

unsigned long long int n;

Но первый вариант, так сказать, дидактичнее: учит, как избегать промежуточных переполнений... Например, для 6000000000 просто

unsigned long long int n;

сломается, а вот вариант с делением пополам до умножения — сработает.

→ Ссылка