为什么Int32.MinValue - 1返回Int32.MaxValue?

5
当我执行以下代码时,出现了(对我而言)一些意外的行为。
int i = Int32.MinValue;
i--;
if (i == Int32.MaxValue)
{
    Console.WriteLine("i == Int32.MaxValue");
}
i++;
if (i == Int32.MinValue)
{
    Console.WriteLine("i == Int32.MinValue");
}

为什么Int32.MinValue上的-1不会抛出异常?
4个回答

8
由于下溢,值会循环。如果想要溢出/下溢抛出异常,需要使用 checked 语句块。

checked 关键字用于显式启用整数类型算术运算和转换的溢出检查。


5

来自MSDN:

当整数溢出发生时,所发生的情况取决于执行上下文,可以是检查过的或未检查过的。在检查过的上下文中,会抛出一个OverflowException。在未检查过的上下文中,结果的最高有效位将被丢弃,继续执行。因此,C#允许您选择处理或忽略溢出。

链接到MSDN


2

C#和C一样,如果没有明确要求进行溢出/下溢检查,它实际上不会执行这些检查。因此,它可以毫无问题地从100...000减去1并得到011...111


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接