为什么不引发溢出异常?

Why isn't an overflow exception raised?

以下运行正常,没有错误,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 不再是 ab[=32 的总和=],其中 ab 的类型为 int。有时是,但有时是 ab 和 2*int.MinValue.

的总和*

* Sum 为普通英语加法的意思,忽略任何计算机知识或字数

在 PowerShell 中,它看起来更好,但它仍然不是添加操作的硬件异常。它似乎在转换回 int:

之前使用了 long
[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."

默认情况下,C# 中的溢出检查处于关闭状态。以常用方式简单地取值"wrap round"。

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

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

有关详细信息,请参阅 C# 参考中的 checked and unchecked 页或 C# 语言规范的第 7.6.12 节。

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

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

来启用此功能
checked
{
    int i = int.MaxValue + int.MaxValue;
    Console.WriteLine(i);
}