【问题标题】:Why does Int32.MinValue - 1 return Int32.MaxValue?为什么 Int32.MinValue - 1 返回 Int32.MaxValue?
【发布时间】:2011-06-20 06:02:30
【问题描述】:

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

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 不抛出异常?

【问题讨论】:

    标签: c# clr


    【解决方案1】:

    由于下溢,值环绕。

    如果您希望引发溢出/下溢,则需要使用 checked 部分。

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

    【讨论】:

      【解决方案2】:

      来自 MSDN:

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

      Link to MSDN

      【讨论】:

        【解决方案3】:

        C# 与 C 一样,实际上并不进行上溢/下溢检查,除非明确写入/告知这样做。因此,从100...000 中减去 1 并得到011...111 是没有问题的。

        【讨论】:

          【解决方案4】:

          int 是一个two's complement 二进制数。

          【讨论】:

            猜你喜欢
            • 2011-03-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-16
            相关资源
            最近更新 更多