整数溢出异常

时间:2015-12-18 17:43:29

标签: c# .net integer-overflow

为什么我在这里遇到编译错误:

int a = 2147483647 + 10;

而不是在这里,如果我正在执行相同的操作:

int ten = 10;
int b = 2147483647 + ten;

我正在学习使用已检查,并且MSDN网站无法清除为什么在第一个代码段中引发了OverflowException:

  

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

它只解释行为,但不解释该行为的原因。我想知道引擎盖下会发生什么。

1 个答案:

答案 0 :(得分:9)

原因是当int a = 2147483647 + 10;编译器可以预测语句(a)的结果时,它会知道它会导致溢出,因为 2147483647 10 是常量,它们的值在编译时是已知的。

但是当你有

int ten = 10;
int b = 2147483647 + ten;

某些其他线程(或者其他东西,可能是向导,可能是内存中的危险...)可能在执行ten语句之前更改了int b = 2147483647 + ten;的值,并且溢出不能在编译时预测。