Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将两个int.MaxValue值的变量相乘不会导致OverflowException_C#_Int - Fatal编程技术网

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

C#将两个int.MaxValue值的变量相乘不会导致OverflowException,c#,int,C#,Int,我有一个整数数组,它包含两个值,每个值的最大值为int32: int[] factors = new int[] { 2147483647, 2147483647 }; 我试图得到这两个数字的乘积来创建OverflowException: try { int product = factors[0] * factors [1]; } catch(Exception ex) { } 令我非常惊讶(和沮丧)的是,产品实际返回的值为1。这是为什么?当两个整数的乘积超过int.MaxValu

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

int[] factors = new int[] { 2147483647, 2147483647 };
我试图得到这两个数字的乘积来创建OverflowException:

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

令我非常惊讶(和沮丧)的是,产品实际返回的值为1。这是为什么?当两个整数的乘积超过int.MaxValue时,我将如何引发异常?

您需要将其包含在
选中的
块中以引发溢出异常。替换
int product=factors[0]*factors[1]使用此选项:

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

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

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


您必须调用math类的BigMul(用于乘以大整数并避免溢出),否则即使没有例外,使用*运算符也会得到1

long product = Math.BigMul(factors[0], factors[1]);
要抛出异常,您必须将其置于选中状态

checked
{
     int product = factors[0] * factors[1];
}
关于溢出的伟大教程,使用checked和unchecked


您能将'product'设为Int64吗?这是正确的——请注意,编译器上还有一个“used checked by default”选项。
checked
{
     int product = factors[0] * factors[1];
}