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

为何C#中int与uint相乘结果为long,两int相乘却不升级?

为什么int与uint相乘返回long,而两个int相乘仍返回int?

先看你给出的代码:

public void test(int intVal1, int intVal2, uint uintVal)
{
    int res1 = intVal1 * intVal2; // 合法,结果为int
    int res2 = intVal1 * uintVal; // 不合法,结果为long
}

1. int与uint相乘的类型提升逻辑

当有符号32位整数(int)和无符号32位整数(uint)进行运算时,C#的类型提升规则会把两者都转换为long(有符号64位整数),核心原因有两点:

  • uint的取值范围是0到4294967295,远大于int的最大值2147483647。如果把int隐式转成uint,int的负数会被转换成超大的正数(比如-1转uint是4294967295),这种转换会带来逻辑歧义,很容易引发意外bug。
  • 提升到long后,既能完整容纳uint的全部取值,也能保留int的正负值,同时两者相乘的最大结果(2147483647 * 4294967295)也能被long完全容纳,从根源上避免了这类跨符号类型运算的溢出风险。

2. 两个int相乘的设计考量

两个int相乘结果仍为int,是C#从C/C++继承并保留的设计,核心考量是:

  • 性能优先:32位整数运算在多数硬件上比64位更快,默认使用int运算能保证常规场景下的性能开销最小。
  • 开发者控制权:溢出问题可以通过checked上下文显式检测,或者unchecked上下文忽略,把溢出的处理权完全交给开发者,而不是默认提升类型增加不必要的开销。比如:
    checked
    {
        int res1 = intVal1 * intVal2; // 溢出时直接抛出OverflowException
    }
    

总结来说,int和uint的运算涉及有符号与无符号的类型歧义,提升到long是为了避免隐式转换的意外;而两个int的运算没有类型歧义,默认保留int类型是为了性能和开发者的控制灵活性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:12:34