VB.NET vs C#整数除法[重复]
Posted
技术标签:
【中文标题】VB.NET vs C#整数除法[重复]【英文标题】:VB.NET vs C# integer division [duplicate] 【发布时间】:2011-08-26 04:45:00 【问题描述】:有人愿意解释一下为什么这两段代码会显示不同的结果吗?
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
【问题讨论】:
似乎在 VB.NET 中,p / i
在两个 Integer
s 上的结果是一个 Double
***.com/questions/1953164/…,然后被压缩成一个 Integer
。
如果你在 VB.NET 中工作,你真的应该打开 Option Strict - 那么编译器会因为精度损失而产生错误。
【参考方案1】:
当您查看这两个 sn-ps 生成的 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
【讨论】:
一个简单问题的令人耳目一新的复杂答案。 +1。感谢您巧妙地解释它:)。只是想知道微软是否计划在未来的 .net 版本中中和这些语言特定的东西? @Sandeep:我不认为他们会改变这种行为,因为它不仅在 VB.NET 中以这种方式工作,而且在以前的版本中也是如此。这意味着 VB 程序员已经习惯了这种行为并且他们确实期望它。 我们可以查看VB language specification或manual。在 VB 中,/
总是表示浮点除法,而 `\` 表示整数除法。恕我直言,通过阅读手册而不是阅读编译器生成的 IL 来学习 VB 更快。【参考方案2】:
在VB中,做整数除法,反斜杠:
Dim y As Integer = p \ i
否则它会扩展为浮点数进行除法,然后在分配给y
时在舍入后强制返回int
。
【讨论】:
+1。 “这种行为是设计使然”VB 10 language specification 第 11.13.6 节 为什么这没有在 c# 中实现让我感到困惑;清晰,简洁,有用。可能“他们”只是不喜欢 VB 有一些优雅的想法!【参考方案3】:VB.NET integer division operator 是 \
,而不是 /
。
【讨论】:
【参考方案4】:"除法在 C# 和 VB 中的执行方式不同。与其他基于 C 的语言一样,当两个操作数都是整数文字或整数变量(或整数常量)时,C# 会截断除法结果。在 VB 中,您必须使用整数除法运算符(\
) 得到类似的结果。”
Source
【讨论】:
【参考方案5】:在 C# 中,当分子和分母都是整数时,使用 /
应用整数除法。而在 VB.Net 中,'/' 会导致浮点除法,因此对于 VB.Net 中的整数除法,请使用 \
。看看这个MSDN post。
【讨论】:
不,这是不正确的。有关详细信息,请参阅其他答案。 (回应this 回复者在现已删除的评论中提供的理由。) 1)不适用;它没有解释问题中讨论的行为。 2)我为什么要关心互联网上的其他人有同样的误解?无论如何,我不能对这个答案投反对票。 3) 即使这是正确的,-1 表示从其他人的答案中复制和粘贴内容而不注明出处。 我很久以前就看到了这个帖子,所以我承认了,显然你不可能记住你在互联网上阅读的任何内容的链接。 那么应该不可能记住在您的答案中使用它的确切措辞。无论如何,既然您已经更新了答案以匹配 @Oded 的答案,我不确定它的用途是什么。 好吧,我接受我应该在发布之前验证答案。以上是关于VB.NET vs C#整数除法[重复]的主要内容,如果未能解决你的问题,请参考以下文章