C#将值为int.MaxValue的两个变量相乘不会导致OverflowException

时间:2013-07-21 19:07:46

标签: c# int

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

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

尝试获取这两个数字的乘积以创建OverflowException:

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

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

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

如果没有checked阻止,结果将被截断,因为它超出int的最大容量。