4

我有一个包含两个值的整数数组,每个值都是 int32 的最大值:

int[] factors = new int[] { 2147483647, 2147483647 };

试图让这两个数字的乘积来创建一个溢出异常:

try
{
    int product = factors[0] * factors [1];
}
catch(Exception ex)
{
}

令我惊讶(和沮丧)的是,product 实际上返回值 1。为什么会这样,当两个整数的乘积超过 int.MaxValue 时,我将如何抛出异常?

4

3 回答 3

8

因为 C# 的默认行为是不使用 int 检查溢出。但是,您可以使用checked关键字强制溢出检查。

try
{
    checked
    {
        int product = factors[0] * factors [1];
    }
}
catch(Exception ex)
{
}
于 2013-07-21T19:10:12.480 回答
2

您将不得不调用数学类的 BigMul(用于将大整数相乘并避免溢出),否则即使没有例外,使用 * 运算符也会导致 1。

long product = Math.BigMul(factors[0], factors[1]);

要抛出异常,您必须进行检查。

checked
{
     int product = factors[0] * factors[1];
}

使用选中和未选中的关于溢出的精彩教程

http://www.codeproject.com/Articles/7776/Arithmetic-Overflow-Checking-using-checked-uncheck

于 2013-07-21T22:26:45.683 回答
0

您需要将其包含在一个checked块中以引发溢出异常。替换int product = factors[0] * factors [1];为:

checked
{
    int product = factors[0] * factors [1];
}

如果没有checked块,结果将被截断,因为它超过了int的最大容量。

于 2013-07-21T19:10:05.000 回答