整数溢出异常

本文关键字:异常 溢出 整数 | 更新日期: 2023-09-27 18:27:18

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

int a = 2147483647 + 10;

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

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

我正在学习的用法检查,MSDN网站不清楚为什么在第一个代码片段中引发OverflowException:

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

它只解释了行为,而没有解释这种行为的原因。我想知道引擎盖下会发生什么。

整数溢出异常

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

但是当你有

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

在执行int b = 2147483647 + ten;语句之前,其他线程(或其他线程,可能是向导,可能是内存中的危险…)可能已经更改了ten的值,并且在编译时无法预测溢出。