Хранение большого числа в C - PullRequest
       13

Хранение большого числа в C

1 голос
/ 17 сентября 2011

У меня есть следующий код, где у меня есть массив. Я добавляю большое число к этому массиву, но при печати оно показывает меньшее, неправильное значение. Почему это так, и есть ли способ это исправить?

int x[10];
x[0] = 252121521121;
printf(" %i " ,  x[0]);   //prints short wrong value

Ответы [ 4 ]

5 голосов
/ 17 сентября 2011

Ваш номер требует 38 бит.Если int вашей платформы не такой большой (и нет причин, по которым это должно быть), то число просто не будет соответствовать.(На самом деле, даже литерал int уже должен был вызвать предупреждение компилятора, предполагая, что это C или C ++.)

Вы всегда можете использовать тип данных с гарантированным размером, например, int64 или что-то в этом роде,в зависимости от вашего языка и платформы.Вероятно, здесь нет необходимости в библиотеках произвольной точности.

В C включают <stdint.h> и используют int64_t, или просто используют long long int, и убедитесь, что вы инициализируете его издлинный длинный целочисленный литерал, например 252121521121LL.(Могу добавить, что long long официально являются лишь частью самых последних языковых стандартов.)

( Edit: long long int гарантированно будет по крайней мере 64-битным, поэтому он должен бытьхороший выбор.)

1 голос
/ 17 сентября 2011

Если у вас проблема только с этим конкретным номером, просто используйте long long int, как предлагалось в предыдущих ответах.
В противном случае, для еще больших чисел (>1E19 для чисел со знаком) вы можете захотеть переключиться на библиотеку большого числа или кодировать себя такого типа данных. В основном вам нужно хранить каждую цифру вашего номера в массиве (или связанном списке) и вручную кодировать основные необходимые вам операции с ними: сложение, вычитание, умножение и т. Д.

Некоторые библиотеки включают https://mattmccutchen.net/bigint/ или GMP.

1 голос
/ 17 сентября 2011

Значение int в большинстве систем составляет 32 бита. Этого достаточно, чтобы хранить около 2 миллиардов подписанных или 4 миллиардов без подписи. Для хранения больших чисел вам нужна большая форма int. (К сожалению, в некоторых системах long int совпадает с int - хорошая старая стандартизация - поэтому вам нужно перейти к long long int. Лучше, если вы найдете в своей библиотеке typedef, например int64_t.)

0 голосов
/ 17 сентября 2011

Ну, кажется, ваше число превышает максимальное значение, которое может содержать 32-битное целое число.

...