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

76

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

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
  • 7
    Похоже, в VB.NET p / i для двух результатов Integer собой Double stackoverflow.com/questions/1953164/…, который затем преобразуется в Integer .
  • 2
    Если вы работаете в VB.NET, вам действительно следует включить Option Strict - тогда компилятор сгенерировал бы ошибку из-за потери точности.
Теги:
operators
division

5 ответов

82
Лучший ответ

Когда вы смотрите на 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

  • 17
    Восхитительно сложный ответ на простой вопрос.
  • 0
    +1. Спасибо, что объяснили это аккуратно :). Просто интересно узнать, планирует ли Microsoft нейтрализовать эти специфичные для языка вещи в будущих выпусках .net?
Показать ещё 3 комментария
81

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

Dim y As Integer = p \ i

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

  • 3
    +1. «Такое поведение является преднамеренным» VB 10, раздел спецификации языка 11.13.6
  • 0
    И почему это не реализовано в C # смущает меня; ясно, кратко, полезно. Вероятно, «им» просто не нравится идея, что у VB есть некоторая элегантность!
16
8

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

Источник

-3

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

  • 1
    Нет, это неверно Смотрите другие ответы для деталей.
  • 0
    (В ответ на это обоснование, предложенное ответчиком в уже удаленном комментарии.) 1) Это неприменимо; это не объясняет поведение, обсуждаемое в вопросе. 2) Почему меня должно волновать, что у кого-то еще в Интернете такое же недоразумение? Я не могу понизить этот ответ в любом случае. 3) Даже если это правильно, -1 для копирования и вставки содержимого из чужого ответа без указания авторства.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню