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

