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

时间:2011-06-20 06:02:31

标签: c# clr

当我执行以下代码时,我(对我来说)有一些意想不到的行为。

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 个答案:

答案 0 :(得分:7)

由于下溢值,所以值环绕。

如果要抛出溢出/下溢,则需要使用checked部分。

  

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

答案 1 :(得分:5)

来自MSDN:

  

当发生整数溢出时,会发生什么取决于执行上下文,可以检查或取消选中。在已检查的上下文中,抛出了OverflowException。在未经检查的上下文中,结果的最高有效位被丢弃并继续执行。因此,C#为您提供了处理或忽略溢出的选择。

Link to MSDN

答案 2 :(得分:2)

与C一样,C#实际上不会执行上溢/下溢检查,除非明确写入/告知这样做。因此,从100...000中减去1并获取011...111毫无疑问。

答案 3 :(得分:2)

inttwo's complement二进制数。