80 votes

VB.NET vs C# division entière

Quelqu'un peut-il expliquer pourquoi ces deux morceaux de code donnent 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

83voto

Christian Points 2940

Si vous examinez le code IL produit par ces deux extraits, vous constaterez que VB.NET convertit d'abord les valeurs entières en doubles, applique la division et arrondit le résultat avant de le reconvertir en int32 et de le stocker dans y.

C# ne fait rien de tout cela.

VB.NET IL Code :

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 IL C# :

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 "correcte" des nombres entiers en VB nécessite une barre oblique inversée : p \ i

78voto

Marc Gravell Points 482669

En VB, pour faire entier inverser la barre oblique :

Dim y As Integer = p \ i

Sinon, il est étendu en virgule flottante pour la division, puis ramené de force à une valeur de int après arrondi lorsqu'ils sont affectés à y .

16voto

Oded Points 271275

VB.NET opérateur de division des entiers es \ , pas / .

8voto

lance Points 6325

"La division est effectuée différemment en C# et en VB. C#, comme d'autres langages basés sur le 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). En VB, vous devez utiliser l'opérateur de division des entiers ( \ ) pour obtenir un résultat similaire".

Source

-1voto

Prescott Points 3947

VB.NET arrondit et C# tronque...je crois

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X