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

  显示原文与译文双语对照的内容
0 0

我试过下面的代码:

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

此代码可以很好地和结果将包含2 ( I 知道为什么) 。

但在此过程:

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

这不会编译是因为.Why溢出问题?

时间:原作者:2个回答

0 0

因为这两个 xy是编译时常量,也是 x + y. 编译器知道结果将溢出,所以它还是什么。

可以修复此通过使用 unchecked表达式:

int result = unchecked(x + y);

从第7 .6 .12 C# 5 规范的清单之后 +, -, /*:

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

  • checked上下文,如果操作是常数表达式( §7 .19 ),编译时出错。
  • 在asp 。 unchecked上下文,则结果被截断,放弃不适合目标类型的任何高序位。

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

常量在编译时可被完全计算的表达式( 表达式),默认的溢出检查上下文总是 checked. 除非常数表达式被显式地放在一个 unchecked表达式的上下文,编译时间评估期间发生的溢出总是导致编译时错误。

原作者:
...