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

为何int.MaxValue与int.MinValue的差值无法存入long类型变量?

为什么int.MaxValue与int.MinValue的差值存入long会得到异常结果?

这个问题的核心在于整数溢出和C#中运算的类型优先级规则,咱们一步步拆解来看:

1. 先明确int的取值范围

int是32位有符号整数,它的最大值int.MaxValue为2147483647,最小值int.MinValue为-2147483648。你要计算的差值是:
2147483647 - (-2147483648) = 4294967295
这个数值远超出了int类型能容纳的最大值(2147483647)。

2. 为什么会得到-1?

在C#中,当两个int类型的操作数进行运算时,整个运算过程会保持int类型。当运算结果超出int的范围时,就会发生整数溢出。默认情况下(Release模式)C#不会检查整数溢出,会按照二进制补码的规则循环处理:
4294967295的二进制是32位全1,作为有符号int解读时,这个值就是-1。

你的两段代码本质上都是先完成了int类型的减法(溢出后得到-1),再把这个结果赋值给long变量——这时候只是把int的-1转换为long的-1,自然结果不符合预期。

3. 正确的解决方法

要避免这个问题,你需要让运算在long类型下进行,只需要把其中一个操作数先转换为long类型即可。此时C#会自动将另一个int操作数提升为long,整个运算就不会发生溢出了:

修改后的第一段代码:

static void Main(string[] args) { 
    int a = int.MaxValue; 
    int b = int.MinValue; 
    long c = (long)a - b; // 先将a转为long,运算以long类型执行
    Console.WriteLine(a); 
    Console.WriteLine(b); 
    Console.WriteLine(c); // 输出正确结果:4294967295
    Console.ReadLine(); 
}

修改后的第二段代码:

static void Main(string[] args) { 
    long a = (long)int.MaxValue - int.MinValue; // 转换其中一个操作数为long
    Console.WriteLine(a); // 输出正确结果:4294967295
    Console.ReadLine();
}

内容的提问来源于stack exchange,提问作者Tandy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:07:20