web-dev-qa-db-ja.com

VB.NETとC#の整数除算

これらの2つのコードが異なる結果を示す理由を誰かが説明してくれませんか?

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
80

これらの2つのスニペットが生成する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

83
Christian

VBでinteger除算を行うには、スラッシュを逆にします。

Dim y As Integer = p \ i

それ以外の場合は、除算のために浮動小数点に展開され、intに割り当てられた場合は、丸め後にyに強制的に戻されます。

78
Marc Gravell

VB.NET 整数除算演算子\ではなく/

16
Oded

「除算はC#とVBでは異なる方法で実行されます。C#は、他のCベースの言語と同様に、両方のオペランドが整数リテラルまたは整数変数(または整数定数)である場合、除算結果を切り捨てます。VBでは、整数除算演算子(\)でも同様の結果が得られます。」

ソース

8
lance