整数溢出异常

5

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

int a = 2147483647 + 10;

如果我执行相同的操作,那么这里就不是正确的位置:

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

我正在学习使用“checked”,但MSDN网站没有清楚地解释为什么第一个代码片段会引发OverflowException:
默认情况下,一个只包含常量值的表达式,在目标类型范围之外产生值时会导致编译器错误。如果表达式包含一个或多个非常量值,则编译器不会检测到溢出。这只解释了行为而不是原因。我想知道背后发生了什么。

1
在第一种情况下,您遇到了编译器错误,而不是异常。 - CodesInChaos
1个回答

9

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

但是当你有下面这种情况时:

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

在执行 int b = 2147483647 + ten; 语句之前,其他线程(或者其他的什么东西,也可能是内存中的一个巫师或隐患...)可能已经改变了 ten 的值,并且编译时无法预测溢出情况。


1
赢了30秒...你真快。+1 - Camilo Terevinto
好的,那么当计算两个数字时编译器会报错,但是当计算数字和变量“ten”时却不会。在这种情况下,你必须使用checked来识别溢出。这有点不一致,不是吗? - Rober
1
如果您想在运行时获得相同的行为,请在项目设置中勾选框以使其默认为“已选中”,或将代码包装在一个检查块checked { int ten = 10; int b = 2147483647 + ten; }中,这也会在运行时引发相同的错误。您无法在编译时获得此行为。 - Scott Chamberlain
它不会强制执行相同的行为,编译器也不会对 int b = 2147483647 + ten; 的检查版本给出编译错误。@ScottChamberlain - Hamid Pourjam
1
@ScottChamberlain 我明白了,高级设置:“检查算术溢出/下溢” TA - Rober

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接