Какой тип данных использовать для очень больших чисел в C ++? - PullRequest
10 голосов
/ 29 августа 2010

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

integer constant is too large for "long" type. 

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

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

Ответы [ 3 ]

28 голосов
/ 29 августа 2010

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)
}
9 голосов
/ 29 августа 2010

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

long long int value = 600851475143LL;

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

4 голосов
/ 29 августа 2010

Посмотрите библиотеку GNU MP Bignum http://gmplib.org/

...