You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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ç

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:50:11