【问题标题】:Why does int32.maxvalue + 1 overflow a long?为什么 int32.maxvalue + 1 溢出很长?
【发布时间】:2014-01-31 19:41:12
【问题描述】:

如果您将以下代码放入 .NET 4.5 应用程序中:

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + 1;

生成编译器错误,说明“在检查模式下编译时操作溢出”。我知道我可以把它放在一个“未经检查”的块中并且没问题,但我的问题是为什么错误首先出现?显然 long 可以容纳 int 的最大值加一。

请注意,使用 Int32 和 Int64 代替 long 和 int 似乎没有帮助。

【问题讨论】:

  • 不会溢出很长时间;它溢出了一个 int。
  • 当运行时评估它时,它需要一个 32 位整数并将其加 1。
  • 所以唯一的方法是在未选中模式下?

标签: c# .net


【解决方案1】:

这是因为赋值右侧的计算是以整数类型进行的。它是溢出整数

您可以通过以下方式解决此问题:

public const long MAXIMUM_RANGE_MAGNITUDE = int.MaxValue + (long)1; // or 1L

通过将至少一个操作数转换为 long

您收到错误的原因在 C# 规范中指定。

C# Specification Section 4.1.5 (Integral types)

对于二进制 +、–、*、/、%、&、^、|、==、!=、>、= 和 可以完全代表所有可能的 两个操作数的值。 然后使用 T 类型的精度,结果的类型是 T(或 bool 关系运算符)。一个操作数是不允许的 使用二元运算符键入 long,另一个为 ulong 类型。

在您的情况下,因为加法的两个操作数都可以用int 表示,因此计算是以整数类型完成的。将操作数之一显式转换为long 将导致long 结果,因此不会出现溢出错误。

【讨论】:

  • 很好的答案,我对您发布的代码尝试了几种变体,但显然不是正确的!不过你的效果很好。
【解决方案2】:

您的代码实际上如下所示:

(long)(int.MaxValue + 1)

但由于 .Net 框架在 int 和 long 之间具有内置的隐式转换,因此您不必在代码中显式地对 long 进行强制转换。

所以首先执行这部分代码:

int.MaxValue + 1

并且此操作的结果是一个int 值,它会导致溢出异常。 所以你的代码甚至没有机会开始从 int 到 long 的转换。

【讨论】:

    【解决方案3】:

    我认为这与计算int.MaxValue + 1 的值有关转换为long 之前。当然 long 可以保存该值,但是由于您正在进行整数加法,因此在进行强制转换之前,无法将 int.MaxValue + 1 的整数值存储在 int 中。

    【讨论】:

      【解决方案4】:

      试试

      public const long MAXIMUM_RANGE_MAGNITUDE = (long)int.MaxValue + 1L;
      

      【讨论】:

        【解决方案5】:

        将常量值转换为 long。

        public const long MAXIMUM_RANGE_MAGNITUDE = (long) int.MaxValue + 1;
        

        【讨论】:

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