使用常量进行算术运算时出现溢出错误

时间:2013-11-01 20:40:11

标签: c#

我尝试了以下代码:

int x, y;
x = y = int.MaxValue;

int result = x + y;

此代码工作正常,结果将包含-2(我知道原因)。

但这样做的时候:

const int x = int.MaxValue;
const int y = int.MaxValue;

int result = x + y;

由于溢出问题,这不会编译。为什么?

1 个答案:

答案 0 :(得分:13)

因为xy都是编译时常量,所以x + y也是。{1}}。编译器知道结果会溢出,所以它会抱怨它。

您可以使用unchecked表达式修复此问题:

int result = unchecked(x + y);

来自C#5规范的第7.6.12节 - 列出+-/*之后:

  

当上述操作之一产生的结果太大而无法在目标类型中表示时,执行操作的上下文控制结果行为:

     
      
  • checked上下文中,如果操作是常量表达式(第7.19节),则会发生编译时错误。
  •   
  • unchecked上下文中,通过丢弃任何不适合目标类型的高位来截断结果。
  •   
     

对于未由任何checkedunchecked运算符或语句包含的非常量表达式(在运行时计算的表达式),默认溢出检查上下文为unchecked除非外部因素(例如编译器开关和执行环境配置)要求进行检查评估。

     

对于常量表达式(可在编译时完全求值的表达式),默认溢出检查上下文始终为checked。除非在unchecked上下文中明确放置常量表达式,否则在表达式的编译时评估期间发生的溢出总是会导致编译时错误。