VB.NET vs C# целочисленное деление [дубликат]


этот вопрос уже есть ответ здесь:

кто-нибудь хочет объяснить, почему эти два фрагмента кода показывают разные результаты?

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
5 80

5 ответов:

когда вы посмотрите на IL-код, который производят эти два фрагмента, вы поймете, что VB.NET сначала преобразует целочисленные значения в двойные, применяет деление, а затем округляет результат, прежде чем он будет преобразован обратно в int32 и сохранен в y.

C# не делает ничего из этого.

VB.NET код Ил:

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

в VB, чтобы сделать целое деление, обратная косая черта:

Dim y As Integer = p \ i

в противном случае он расширяется до плавающей точки для деления, а затем принудительно возвращается к int после округления при назначении y.

"разделение выполняется по-разному в C# и VB. C#, как и другие языки на основе C, усекает результат деления, когда оба операнда являются целочисленными литералами или целочисленными переменными (или целочисленными константами). В VB необходимо использовать оператор целочисленного деления (\), чтобы получить аналогичный результат."

источник

в C# целочисленное деление применяется с / когда и числитель и деноминатор являются целыми числами. В то время как, в VB.Net ' / ' приводит к делению с плавающей запятой, поэтому для целочисленного деления в VB.Net используйте \. Взгляните на это MSDN post.