System.OverflowException 在未经检查的 C# 块中
System.OverflowException in unchecked block of C#
如果我将 Int32.MinValue 和 -1 传递给 Divide()
方法,我会得到一个 System.OverflowException
,尽管该块发生在 unchecked
块中。
private static int Divide(int n, int d)
{
return unchecked (n / d);
}
这让我感到惊讶 - 除非我错误地阅读了 documentation 的选中/未选中,否则我希望它只会给我一个溢出的输出(因为 Int32.MinValue / -1 = 2^31 = Int32.MaxValue + 1,我期望溢出到 Int32.MinValue 的值)。相反,它抛出了 OverflowException
.
这里 DotNetFiddle 显示了这个问题。
From the C# draft specification on integer division:
If the left operand is the smallest representable int
or long
value and the right operand is -1
, an overflow occurs. In a checked
context, this causes a System.ArithmeticException
(or a subclass thereof) to be thrown. In an unchecked
context, it is implementation-defined as to whether a System.ArithmeticException
(or a subclass thereof) is thrown or the overflow goes unreported with the resulting value being that of the left operand.
我不确定微软在哪里列出了它对实现定义行为的选择,但显然他们在这里选择了第一个选项。
ECMA-334 的附件 B 中列出了这个和其他实现定义或未定义的行为。
上面的draft specification是最近更新的,但是好像少了这个附件
如果我将 Int32.MinValue 和 -1 传递给 Divide()
方法,我会得到一个 System.OverflowException
,尽管该块发生在 unchecked
块中。
private static int Divide(int n, int d)
{
return unchecked (n / d);
}
这让我感到惊讶 - 除非我错误地阅读了 documentation 的选中/未选中,否则我希望它只会给我一个溢出的输出(因为 Int32.MinValue / -1 = 2^31 = Int32.MaxValue + 1,我期望溢出到 Int32.MinValue 的值)。相反,它抛出了 OverflowException
.
这里 DotNetFiddle 显示了这个问题。
From the C# draft specification on integer division:
If the left operand is the smallest representable
int
orlong
value and the right operand is-1
, an overflow occurs. In achecked
context, this causes aSystem.ArithmeticException
(or a subclass thereof) to be thrown. In anunchecked
context, it is implementation-defined as to whether aSystem.ArithmeticException
(or a subclass thereof) is thrown or the overflow goes unreported with the resulting value being that of the left operand.
我不确定微软在哪里列出了它对实现定义行为的选择,但显然他们在这里选择了第一个选项。
ECMA-334 的附件 B 中列出了这个和其他实现定义或未定义的行为。 上面的draft specification是最近更新的,但是好像少了这个附件