为何int值超出范围运算后得到-2而非StackOverflowException异常?
整数溢出为何未触发StackOverflowException反而得到-2?
先看你提供的代码:
求和方法:
public int Sum(int a, int b) { return a + b; }
调用代码:
int result = Sum(int.MaxValue, int.MaxValue);
核心原因:两种异常完全不是一回事
首先得明确——StackOverflowException和整数数值溢出没有任何关联:
- StackOverflowException是调用栈空间耗尽时才会触发的异常,比如无终止递归、嵌套调用层数过多撑爆了栈内存,才会抛出这个异常。
- 你遇到的是整数算术溢出,这是数值运算超出类型取值范围导致的,C#默认情况下不会为这种情况抛出异常,而是执行「溢出回绕」操作。
为什么结果是-2?
int是32位有符号整数,取值范围是 -2147483648 到 2147483647(即-2^31到2^31-1)。两个int.MaxValue相加的结果是2147483647 + 2147483647 = 4294967294,这个值远远超出了int的上限。
按照有符号整数的二进制补码规则,超出范围的高位会被截断,剩下的32位二进制值转换成十进制就是-2——这就是你看到结果的原因。
想让溢出触发异常怎么办?
C#默认是「unchecked」模式,也就是忽略溢出直接回绕。如果要在溢出时抛出OverflowException(注意不是StackOverflowException),可以用checked关键字包裹代码:
checked { int result = Sum(int.MaxValue, int.MaxValue); }
或者直接把求和方法改成checked模式:
public int Sum(int a, int b) { checked { return a + b; } }
这样再执行加法时,一旦溢出就会抛出OverflowException,而不是默默返回回绕后的数值。
内容的提问来源于stack exchange,提问作者alper saraç
相关产品推荐
相关产品推荐

