Подтвердить что ты не робот

VB.NET vs С# целочисленное деление

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

VB.NET v4.0

Dim p As Integer = 16
Dim i As Integer = 10
Dim y As Integer = p / i
//Result: 2

С# v4.0

int p = 16;
int i = 10;
int y = p / i;
//Result: 1
4b9b3361

Ответ 1

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

С# ничего не делает.

Код 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

Код С# 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

Ответ 2

В VB, чтобы сделать целое число, отмените косую черту:

Dim y As Integer = p \ i

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

Ответ 4

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

Источник

Ответ 5

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