【问题标题】:Compiler respond differently when assigning int.MaxValue to variable [duplicate]将 int.MaxValue 分配给变量时,编译器的响应不同[重复]
【发布时间】:2016-03-09 21:51:40
【问题描述】:

根据documentationint.MaxValue是一个int字段。当我这样做时

int a = int.MaxValue;
int b = a + 1;

b 的值符合预期的int.MinValue。但是当我这样做时

int a = int.MaxValue + 1;

我得到编译错误

检查模式下编译时操作溢出

为什么会有差异?

【问题讨论】:

  • 不知道为什么会这样,只想提一下这是在 checked 块中执行时的预期行为
  • int a = unchecked(int.MaxValue + 1);

标签: c#


【解决方案1】:

来自https://msdn.microsoft.com/en-us/library/aa691319(v=vs.71).aspx

常量表达式是可以在编译时完全计算的表达式。

只要表达式属于上面列出的类型之一并且只包含上面列出的结构,就会在编译时计算表达式。

除非将常量表达式显式放置在未经检查的上下文中,否则在表达式的编译时求值期间发生在整数类型算术运算和转换中的溢出总是会导致编译时错误

所以这就解释了为什么int a = int.MaxValue + 1; 会出现编译错误(int.MaxValueconst int)。

int a = int.MaxValue;
int b = a + 1;

不同,因为它不是常量表达式。它们是两个非常量变量(参见并且只包含上面列出的结构?显然声明中间变量不是可接受的结构之一:-))

【讨论】:

  • 这似乎是最准确的答案。
【解决方案2】:

不同之处在于,在第一行中,您添加了两个常量。 int.MaxValue 是一个常数,1 也是。所以编译器会在编译时进行计算,但会因为这个警告而失败。

第二行将产生相同的行为,但在运行时,因为您引入了一个变量,并且您的编译器没有对其进行优化以在编译时进行计算时间。

【讨论】:

    【解决方案3】:

    您的编译器可能使用checked 选项(这是一个默认选项)并且它说;

    默认情况下,仅包含常量值的表达式会导致 如果表达式产生的值超出 目标类型的范围。 如果表达式包含一个或多个 非常量值,编译器不会检测到溢出

    由于int.MaxValue1 都是常量,因此您会收到错误消息。

    如果你使用unchecked选项,你会看到同样的结果

    unchecked
    {
        int a = int.MaxValue + 1; // a is int.MinValue
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 2016-12-14
      • 2020-02-06
      • 1970-01-01
      • 2019-10-10
      • 2020-05-19
      • 2012-06-19
      相关资源
      最近更新 更多