Какой тип данных использовать для очень больших чисел в С++?

Мне нужно сохранить номер 600851475143 в моей программе. Я попытался сохранить его в переменной long long int и long double, но при компиляции она показывает ошибку

integer constant is too large for "long" type. 

Я тоже пробовал unsigned long long int. Я использую MinGW 5.1.6 для запуска g++ в Windows.

Какой тип данных следует использовать для хранения номера?

Ответ 1

long long отлично, но вы должны использовать суффикс в литерале.

long long x = 600851475143ll; // can use LL instead if you prefer.

Если вы оставите ll с конца литерала, тогда компилятор предполагает, что вы хотите, чтобы он был int, который в большинстве случаев представляет собой 32-разрядное число со знаком. 32-бит недостаточно для хранения этого большого значения, поэтому предупреждение. Добавляя ll, вы указываете компилятору, что литерал должен интерпретироваться как long long, который достаточно велик, чтобы сохранить значение.

Суффикс также полезен для указания, какая перегрузка вызывает функцию. Например:

void foo(long long x) {}
void foo(int x) {}

int main()
{
    foo(0); // calls foo(int x)
    foo(0LL); // calls foo(long long x)
}

Ответ 2

У вас была правильная идея с long long int (или unsigned long long int), но для предотвращения предупреждения вам нужно сообщить компилятору, что константа является long long int:

long long int value = 600851475143LL;

Те "L" могут быть в нижнем регистре, но я бы посоветовал это сделать - в зависимости от шрифта, нижний регистр "L" часто выглядит как одна цифра ( "1" ).