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
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
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
.
VB.NET opérateur de division entier est \
, ne pas /
.
"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. "