我尝试了以下代码:
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;
由于溢出问题,这将无法编译。为什么?
我尝试了以下代码:
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;
由于溢出问题,这将无法编译。为什么?
因为x
和y
都是编译时常量,所以x + y
. 编译器知道结果会溢出,所以它会抱怨它。
您可以通过使用unchecked
表达式来解决此问题:
int result = unchecked(x + y);
来自 C# 5 规范的第 7.6.12 节 - 在列出+
、-
和/
之后*
:
当上述操作之一产生的结果太大而无法在目标类型中表示时,执行操作的上下文将控制结果行为:
- 在
checked
上下文中,如果操作是常量表达式(第 7.19 节),则会发生编译时错误。- 在
unchecked
上下文中,通过丢弃任何不适合目标类型的高位位来截断结果。对于未被任何
checked
orunchecked
运算符或语句包围的非常量表达式(在运行时计算的表达式),默认的溢出检查上下文是unchecked
除非外部因素(例如编译器切换和执行环境配置)要求检查计算。对于常量表达式(可以在编译时完全求值的表达式),默认的溢出检查上下文总是
checked
. 除非将常量表达式显式放置在unchecked
上下文中,否则在表达式的编译时求值期间发生的溢出总是会导致编译时错误。