преобразование int в / из System.Numerics.BigInteger в C # - PullRequest
5 голосов
/ 20 августа 2011

У меня есть свойство, которое возвращает System.Numerics.BigInteger. Когда я приводил свойство к int, я получил эту ошибку.

Cannot convert type 'System.Numerics.BigInteger' to 'int'

Как я могу конвертировать int в / из System.Numerics.BigInteger в C #?

Ответы [ 5 ]

9 голосов
/ 20 августа 2011

Преобразование из BigInteger в Int32 является явным, поэтому просто присвоение переменной / свойства BigInteger переменной int не работает:

BigInteger big = ...

int result = big;           // compiler error:
                            //   "Cannot implicitly convert type
                            //    'System.Numerics.BigInteger' to 'int'.
                            //    An explicit conversion exists (are you
                            //    missing a cast?)"

Это работает (хотя может вызвать исключение во время выполнения, если значение слишком велико, чтобы поместиться в переменную int):

BigInteger big = ...

int result = (int)big;      // works

Обратите внимание, что, если значение BigInteger заключено в object, его нельзя распаковать и одновременно преобразовать в int:

BigInteger original = ...;

object obj = original;      // box value

int result = (int)obj;      // runtime error
                            //   "Specified cast is not valid."

Это работает:

BigInteger original = ...;

object obj = original;            // box value

BigInteger big = (BigInteger)obj; // unbox value

int result = (int)big;            // works
1 голос
/ 13 сентября 2012

Наличие метода int.Parse работает только в том случае, если исходное значение BigInteger все равно будет соответствоватьЕсли нет, попробуйте это:

int result = (int)(big & 0xFFFFFFFF);

Гадкий?Да.Работает на любое значение BigInteger?Да, поскольку он отбрасывает верхние биты всего, что там есть.

1 голос
/ 20 августа 2011

Вот несколько вариантов, которые преобразуют BigInteger в int

BigInteger bi = someBigInteger;
int i = (int)bi;
int y = Int32.Parse(bi.ToString()); 

Осторожно, хотя, если значение BigInteger слишком велико, оно выдаст новое исключение, поэтому, возможно, выполните

int x;
bool result = int.TryParse(bi.ToString(), out x);

Или

try
{
    int z = (int)bi;
}
catch (OverflowException ex)
{
    Console.WriteLine(ex);
}

Или

int t = 0;
if (bi > int.MaxValue || bi < int.MinValue)
{
    Console.WriteLine("Oh Noes are ahead");
}
else
{
    t = (int)bi;
}
0 голосов
/ 14 февраля 2018

Пытаясь улучшить ответ @ lee-turpin при приведении отрицательных чисел, я пришел к аналогичному решению, но в этом случае без проблемы с отрицательными числами.В моем случае я пытался получить 32-битное хеш-значение от объекта BigInteger.

var h = (int)(bigInteger % int.MaxValue);

Все еще безобразно, но оно работает с любым значением BigInteger.Надеюсь, это поможет.

0 голосов
/ 20 августа 2011

при добавлении попробуйте следовать этой статье

http://msdn.microsoft.com/en-us/library/dd268292.aspx#Y600

С уважением.

...