这个问题在这里已有答案:
任何人都在关心解释为什么这两段代码表现出不同的结果?
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中,要做 integer 除法,反斜杠:
Dim y As Integer = p \ i
否则它会扩展为浮点进行除法,然后在转换为 y 之后强制回到 int .
y
int
VB.NET integer division operator是 \ ,而不是 / .
\
/
“C#和VB中的分区执行方式不同.C#与其他基于C的语言一样,当两个操作数都是整数文字或整数变量(或整数常量)时截断分割结果 . 在VB中,必须使用整数除法运算符( \ )得到类似的结果 . “
Source
在C#中,当分子和分母都是整数时,整数除法应用 / . 然而,在VB.Net '/'中导致浮点divsion,所以对于VB.Net中的整数除法使用 \ . 看看这个MSDN post .
5 回答
当您查看这两个片段产生的IL代码时,您将意识到VB.NET首先将整数值转换为双精度,应用除法,然后在将结果转换回int32并存储在y中之前对结果进行舍入 .
C#没有做到这一点 .
VB.NET IL代码:
C#IL代码:
VB中的“正确”整数除法需要向后斜杠:p \ i
在VB中,要做 integer 除法,反斜杠:
否则它会扩展为浮点进行除法,然后在转换为
y
之后强制回到int
.VB.NET integer division operator是
\
,而不是/
.“C#和VB中的分区执行方式不同.C#与其他基于C的语言一样,当两个操作数都是整数文字或整数变量(或整数常量)时截断分割结果 . 在VB中,必须使用整数除法运算符(
\
)得到类似的结果 . “Source
在C#中,当分子和分母都是整数时,整数除法应用
/
. 然而,在VB.Net '/'中导致浮点divsion,所以对于VB.Net中的整数除法使用\
. 看看这个MSDN post .