C# 两个大数字C之间的差异#

C# 两个大数字C之间的差异#,c#,math,difference,integer-overflow,C#,Math,Difference,Integer Overflow,对于小数字,已经有了此问题的解决方案: 在这里: 在这里: 在这里: 我将总结所有这些问题的答案: Math.Abs(a - b) 问题是当数字较大时这会给出错误的答案(通过溢出)。更糟糕的是,如果(a-b)=Int32.MinValue,则Math.Abs会发生异常崩溃(因为Int32.MaxValue=Int32.MinValue-1): 发生System.OverflowException异常 HResult=0x80131516 Message=对两个补码的最小值求反为 无效 So

对于小数字,已经有了此问题的解决方案:

  • 在这里:
  • 在这里:
  • 在这里:
我将总结所有这些问题的答案:

Math.Abs(a - b)
问题是当数字较大时这会给出错误的答案(通过溢出)。更糟糕的是,如果
(a-b)=Int32.MinValue
,则
Math.Abs
会发生异常崩溃(因为
Int32.MaxValue=Int32.MinValue-1
):

发生System.OverflowException异常
HResult=0x80131516
Message=对两个补码的最小值求反为 无效
Source=mscorlib
StackTrace:在 System.Math.AbsHelper(Int32值)位于System.Math.Abs(Int32值)

它的特殊性质导致难以复制错误

也许我遗漏了一些众所周知的库函数,但是有没有安全地确定差异的方法?

是在.Net 4.0中引入的

在.Net Framework的较低版本中有一些开源实现,但是您最好使用该标准

如果
Math.Abs
仍然让您感到悲伤,您可以自己实现该功能;如果数字是负数(a-b<0),只需修剪负数符号,使其无符号


还有,你试过用双打吗?它们的值要大得多。

正如其他人所建议的,使用System.Numerics中定义的BigInteger(您必须在Visual Studio中包含名称空间) 然后你可以做:

BigInteger a = new BigInteger();
BigInteger b = new BigInteger();
// Assign values to a and b somewhere in here...
// Then just use included BigInteger.Abs method
BigInteger result = BigInteger.Abs(a - b);
Jeremy Thompson的答案仍然有效,但请注意BigInteger名称空间包含一个绝对值方法,因此不需要任何特殊逻辑。另外,Math.Abs需要一个小数,所以如果您试图传入一个大整数,它会让您感到悲伤

请记住,使用大整数有一些注意事项。如果您有一个非常大的数字,C#将尝试为其分配内存,您可能会遇到内存不足的异常。另一方面,大整数很好,因为分配给它们的内存量会随着数字的增大而动态变化


查看此处的microsoft参考资料以了解更多信息:

问题是,您希望如何保持两个大数字之间的差异?例如,如果您正在计算两个有符号长(64位)整数之间的差,并且该差不适合有符号长整数,您打算如何存储它

long    a = +(1 << 62) + 1000;
long    b = -(1 << 62);

long dif = a - b;    // Overflow, bit truncation

long a=+(1这是一个您可能感兴趣的替代方案,但它在很大程度上受特定int大小的限制。此示例使用Int32,并使用位运算符来完成差分,然后是绝对值。此实现可以容忍a-b等于min int值的情况,它自然返回min int value(在不将内容转换为更大的数据类型的情况下,您可以做的其他事情不多)。我不认为这是一个比使用BigInteger更好的答案,但如果没有其他东西,那么使用它是很有趣的:

    static int diff(int a, int b)
    {
        int xorResult = (a ^ b);
        int diff = (a & xorResult) - (b & xorResult);
        return (diff + (diff >> 31)) ^ (diff >> 31);
    }
下面是一些我运行它来处理行为的案例:

        Console.WriteLine(diff(13, 14)); // 1
        Console.WriteLine(diff(11, 9)); // 2
        Console.WriteLine(diff(5002000, 2346728)); // 2655272
        Console.WriteLine(diff(int.MinValue, 0)); // Should be 2147483648, but int data type can't go that large. Actual result will be -2147483648.

BigInteger-转换为long(Int64)怎么样然后找到差异?a和b是Int32还是Int64?可能是任何东西。Int64.MinValue也有同样的问题。我想转换到更高的类型并进行检查是一种方法,谢谢。为了澄清-数学。Abs抛出MinValue的情况。它的显式编码表明X80000的两个S补码没有定义。“崩溃”建议这是图书馆里的一个错误