为何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
相关产品推荐
相关产品推荐

