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

为何VB.NET与C#整数运算结果不同?C#正常VB.NET抛溢出异常

为什么C#和VB.NET整数运算结果不同,VB.NET抛出溢出异常而C#正常输出?

这个问题的核心原因是C#和VB.NET对整数运算的溢出检查默认行为完全不同,下面详细拆解:

1. VB.NET默认启用溢出检查

VB.NET在默认配置下,会对所有整数运算进行溢出检查。我们一步步看你的计算过程:

  • 第一步:bytTen + aa = 10 + 1527870874 = 1527870884,这个值还在32位有符号整数(Integer)的范围(-2147483648 ~ 2147483647)内,没问题。
  • 第二步:把上面的结果乘以bb(28904),得到的数值是1527870884 * 28904 = 44161570031136——这个值远远超出了32位整数的最大值(2147483647)。
  • 此时VB.NET的溢出检查机制触发,直接抛出Arithmetic operation resulted in an overflow异常,中断运算。

2. C#默认关闭溢出检查

C#的整数运算默认处于unchecked模式,也就是不会主动检查运算结果是否超出类型范围。当数值溢出时,它会自动只保留结果的低32位(相当于循环取模):

  • 你得到的726329420,其实就是(1527870884 * 28904 + 35756)这个超大数值被截断为32位后的结果,刚好落在int类型的合法范围内,所以C#能正常输出。

3. 让两者行为一致的方法

让VB.NET和C#一样输出结果(关闭溢出检查)

你可以在VB.NET中使用Unchecked块(需要导入System.Runtime.CompilerServices),或者在项目设置里关闭“溢出检查”选项:

Imports System.Runtime.CompilerServices

Module Module1
    Sub Main()
        Dim bytTen As Byte = 10
        Dim aa As Integer = 1527870874, bb As Integer = 28904, cc As Integer = 35756
        Console.WriteLine(Unchecked((bytTen + aa) * bb + cc))
        Console.ReadKey()
    End Sub
End Module

运行这段代码,VB.NET就会输出和C#一样的726329420。

让C#和VB.NET一样抛出异常(开启溢出检查)

在C#中用checked块包裹运算代码,或者在项目设置中开启“检查算术溢出/下溢”:

class Program {
    static void Main(string[] args) {
        byte bytTen = 10;
        int aa = 1527870874;
        int bb = 28904;
        int cc = 35756;
        Console.WriteLine(checked((bytTen + aa) * bb + cc));
        Console.ReadKey();
    }
}

此时C#也会抛出OverflowException,和VB.NET的默认行为一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:37:41