VB.NET与C#整数除法
任何人都在意解释为什么这两个代码显示不同的结果?
VB.NET v4.0
Dim p As Integer = 16 Dim i As Integer = 10 Dim y As Integer = p / i //Result: 2
C#v4.0
int p = 16; int i = 10; int y = p / i; //Result: 1
当你看这两个片段产生的IL代码时,你会意识到VB.NET首先将整数值转换为双精度值,然后应用除法运算,然后在将结果转换回int32并存储在y中之前对结果进行舍入。
C#没有这一点。
VB.NET的IL代码:
IL_0000: ldc.i4.s 10 IL_0002: stloc.1 IL_0003: ldc.i4.s 0A IL_0005: stloc.0 IL_0006: ldloc.1 IL_0007: conv.r8 IL_0008: ldloc.0 IL_0009: conv.r8 IL_000A: div IL_000B: call System.Math.Round IL_0010: conv.ovf.i4 IL_0011: stloc.2 IL_0012: ldloc.2 IL_0013: call System.Console.WriteLine
C#IL代码:
IL_0000: ldc.i4.s 10 IL_0002: stloc.0 IL_0003: ldc.i4.s 0A IL_0005: stloc.1 IL_0006: ldloc.0 IL_0007: ldloc.1 IL_0008: div IL_0009: stloc.2 IL_000A: ldloc.2 IL_000B: call System.Console.WriteLine
VB中“正确的”整数除法需要一个反斜杠:p \ i
在VB中,要做整数除法,反斜杠:
Dim y As Integer = p \ i
否则扩展为浮点数,然后在分配给y
后强制回到int
。
VB.NET 整数除法运算符是\
,不是/
。
“在C#和VB中执行不同的分区,C#和其他基于C的语言一样,当两个操作数都是整数或整型variables(或整数常量)时,分割结果会被截断,在VB中,必须使用整数除法运算符( \
)得到相似的结果。“
资源
在C#中,当分子和denomenator都是整数时,整数除法应用于/
。 而在VB.Net'/'导致浮点divsion,所以在VB.Net使用\
整数除法。 看看这个MSDN的post 。