我有一个包含两个值的整数数组,每个值都是int32的最大值:
int[] factors = new int[] { 2147483647, 2147483647 };
我尝试获取这两个数字的乘积以创建OverflowException:
try
{
int product = factors[0] * factors [1];
}
catch(Exception ex)
{
}
令我惊讶的是(并且令人沮丧),产品实际上返回值1.为什么这样,当两个整数的乘积超过int.MaxValue时,我将如何抛出异常?
答案 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
的最大容量。