整数溢出检测c# for Add

本文关键字:for Add 检测 溢出 整数 | 更新日期: 2023-09-27 18:08:06

很容易让c#在整数溢出时抛出异常。然而,这不是我想要的。我想检测溢出,这样我就可以继续高阶计算。我正在构建一个大型int实现。

我可以捕获溢出异常,但这对性能来说不是很好。更不用说它在概念上是不正确的。

任何想法如何检查溢出没有异常?

整数溢出检测c# for Add

如果您正在寻找进位行为,其他答案/评论很好地涵盖了这一点。然而,我发现最初的问题是一个有趣的大脑难题(尽管没有实际用处),特别是纯c#检测2有符号整数添加溢出的最佳性能方法是什么。理想情况下,它将生成没有分支的最小IL指令。这是我最终得到的最好的-一个带有bool标志(当溢出时为true,否则为false),另一个带有int"bit"(当溢出时为1,否则为0)。两者都满足上述条件,"位"版本的IL指令较少。喜欢:-)

static int Add(int a, int b, out bool overflowFlag)
{
    unchecked
    {
        int c = a + b;
        overflowFlag = ((a ^ b) >= 0) & ((a ^ c) < 0);
        return c;
    }
}
static int Add(int a, int b, out int overflowBit)
{
    unchecked
    {
        int c = a + b;
        overflowBit = (int)((uint)((a ^ c) & ~(a ^ b)) >> 31);
        return c;
    }
}

如果你想用进位实现加减法,我真的建议使用uint而不是int !在计算前将两个值都转换为ulong:

//Adds a and b
uint[] a = ... , b = ... ;//input
ulong carry=0
for(int i=0;i<length;i++)
{
    carry += (ulong)a[i] + (ulong)b[i];
    uint result = (uint)carry;
    carry >>= 32;//divide by 2^32
    //TODO: store result
}
//TODO: process remaining carry

当我第一次实现这样的东西时,我遇到了符号扩展的问题,因此到处都是无符号类型。