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 在两个 Integers 上的结果是一个 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#整数除法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在python中处理长整数除法[重复]

整数除法总是零[重复]

Java中的整数除法[重复]

Java中的整数除法[重复]

Python 2.x 中的除法 [重复]

如何在整数运算中执行上限除法? [重复]