web-dev-qa-db-fra.com

Division entière VB.NET vs C #

Quelqu'un veut-il expliquer pourquoi ces deux morceaux de code présentent des résultats différents?

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

Lorsque vous regardez le code IL que ces deux extraits produisent, vous vous rendrez compte que VB.NET convertit d'abord les valeurs entières en doubles, applique la division, puis arrondit le résultat avant qu'il ne soit reconverti en int32 et stocké dans y.

C # ne fait rien de tout cela.

Code 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

Code 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

La division entière "correcte" dans VB a besoin d'une barre oblique inverse: p\i

83
Christian

En VB, pour faire ( entier division, inversez la barre oblique:

Dim y As Integer = p \ i

sinon, il est développé en virgule flottante pour la division, puis forcé à revenir à un int après avoir été arrondi lorsqu'il est affecté à y.

78
Marc Gravell

VB.NET opérateur de division entier est \, ne pas /.

16
Oded

"La division est effectuée différemment en C # et VB. C #, comme les autres langages basés sur C, tronque le résultat de la division lorsque les deux opérandes sont des littéraux entiers ou des variables entières (ou des constantes entières). Dans VB, vous devez utiliser l'opérateur de division entière (\) pour obtenir un résultat similaire. "

Source

8
lance