C# 在C中将int转换为System.Numerics.BigInteger或从System.Numerics.BigInteger转换为int#

C# 在C中将int转换为System.Numerics.BigInteger或从System.Numerics.BigInteger转换为int#,c#,casting,biginteger,C#,Casting,Biginteger,我有一个返回System.Numerics.BigInteger的属性。当我将属性强制转换为int时,我得到了这个错误 无法将类型“System.Numerics.BigInteger”转换为“int” 如何在C#?中将int转换为/fromSystem.Numerics.BigInteger,这是显式的,因此仅将BigInteger变量/属性分配给int变量不起作用: BigInteger big = ... int result = big; // compiler e

我有一个返回
System.Numerics.BigInteger
的属性。当我将属性强制转换为int时,我得到了这个错误

无法将类型“System.Numerics.BigInteger”转换为“int”

如何在C#?

中将int转换为/from
System.Numerics.BigInteger
,这是显式的,因此仅将
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
值被装箱在
对象中,则不能取消装箱并同时将其转换为
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

下面是一些将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);

int t=0;
if(bi>int.MaxValue | | bi
只有在初始的BigInteger值适合时,才使用int.Parse方法。如果没有,请尝试以下操作:

int result = (int)(big & 0xFFFFFFFF);
丑陋?对
适用于任何大整数值?是的,因为它扔掉了所有的高位。

通过尝试改进@lee turpin的答案,我得到了一个类似的解决方案,但在这种情况下,没有负数的问题。在我的例子中,我试图从BigInteger对象获得一个32位哈希值

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

仍然很难看,但它适用于任何大的整数值。希望有帮助。

如何处理太大而无法放入
int
的值?能否添加一些代码?BigInteger提供了一个,所以
(int)someBigInteger
应该可以工作。@Oded:测试这个和那个是非常临时的代码。BigInteger实际上并没有那么大。我想从dtb“窃取”答案是不礼貌的-也许你(@dtb)应该把它作为一个答案…如果它适合一个常规整数,为什么要返回一个BigInteger呢?@svick:哪一个?我明白了:“无法将类型'System.Numerics.BigInteger'隐式转换为'int'。存在显式转换(是否缺少强制转换?)@svick:哦,我明白了。谢谢你指出这一点。我想我现在发现了问题。将更新我的答案。取消装箱
biginger
as
int
将抛出
InvalidCastException
,并显示消息“指定的强制转换无效”。这同样不是报告的错误。嗯。。。这仍然不是同样的错误。我没有主意了。OP需要显示更多的代码。这可能会起作用,但通过转换为字符串/从字符串在两个整数类型之间转换并不是一个好的选择。在这种情况下,它只是修复了症状,而不是实际问题。你似乎有点能力,我必须把你当成我的学徒。这对负数有什么作用?好的,当在C#之外运行逐位操作时,它应该可以正常工作。然而,在C#内部,它会对负数抛出一个系统溢出异常。不知道为什么。
int t = 0;
if (bi > int.MaxValue || bi < int.MinValue)
{
    Console.WriteLine("Oh Noes are ahead");
}
else
{
    t = (int)bi;
}
int result = (int)(big & 0xFFFFFFFF);
var h = (int)(bigInteger % int.MaxValue);