Компилятор считает эту конструкцию
-9223372036854775808LL
как целочисленный литерал 9223372036854775808LL
, для которого применяется унарный оператор. Но значение 9223372036854775808
слишком велико для хранения в объекте типа, подписанного long long. Таким образом, компилятор выдает ошибку.
Вместо этого используйте
#include <limits>
//...
v2signed_long v =
{
std::numeric_limits<long long>::max(), std::numeric_limits<long long>::min()
};
Вот демонстрационная программа
#include <iostream>
#include <limits>
#include <vector>
int main()
{
std::vector<long long> v =
{
std::numeric_limits<long long>::max(), std::numeric_limits<long long>::min()
};
for ( const auto &item : v ) std::cout << item << '\n';
return 0;
}
Его вывод
9223372036854775807
-9223372036854775808
Если вы удалили тег C ++, то в C код может выглядеть следующим образом:
#include <stdio.h>
#include <limits.h>
int main(void)
{
long long int a[] = { LLONG_MAX, LLONG_MIN };
printf( "%lld\n%lld\n", a[0], a[1] );
return 0;
}
Вывод программы такой же, как показано выше.
В любом случае, гораздо лучше использовать этот подход вместо магических c чисел с уловкой, которая только сбивает с толку читателей кода.