为什么没有引发溢出异常?

时间:2015-02-06 09:27:08

标签: c# powershell clr

以下运行正常且没有错误,diff为1:

int max = int.MaxValue;
int min = int.MinValue;
//Console.WriteLine("Min is {0} and max is {1}", min, max);
int diff = min - max;
Console.WriteLine(diff);

那么所有程序都不会被怀疑吗? a + b 不再是 a b 的总和,其中 a b 属于int类型。有时它是,但有时它是 a b 和2 * int.MinValue的总和。

*加法的普通英语含义,忽略任何计算机知识或单词大小

在PowerShell中,它看起来更好,但它仍然不是添加操作的硬件异常。在转回long之前似乎使用了int

[int]$x = [int]::minvalue - [int]::maxvalue
Cannot convert value "-4294967295" to type "System.Int32". Error: "Value was either too large or too small for an Int32."

2 个答案:

答案 0 :(得分:7)

默认情况下,在C#中关闭溢出检查。值只是以常见的方式“包裹”。

如果您使用/checked编译了相同的代码或使用了checked { ... }块,则会抛出异常。

根据您正在做的事情,您可能需要检查或明确想要它。例如,在Noda Time中我们默认启用了溢出检查,但明确地将其关闭以进行GetHashCode计算(我们期望溢出并且没有问题)和我们知道的计算不会溢出,并且我们不希望溢出检查的(非常轻微的)性能损失。

有关更多详细信息,请参阅C#参考中的checkedunchecked页面,或C#语言规范的7.6.12节。

答案 1 :(得分:2)

如果未指定,.NET在对数字数据类型int等进行操作时不会检查数字溢出。

您可以通过在已检查模式下构建(将/checked传递给编译器参数)或use checked in a code segment来启用此功能:

checked
{
    int i = int.MaxValue + int.MaxValue;
    Console.WriteLine(i);
}