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 ответов:
когда вы посмотрите на 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
.
VB.NET оператор целочисленного деления и
\
, а не/
.
"разделение выполняется по-разному в C# и VB. C#, как и другие языки на основе C, усекает результат деления, когда оба операнда являются целочисленными литералами или целочисленными переменными (или целочисленными константами). В VB необходимо использовать оператор целочисленного деления (
\
), чтобы получить аналогичный результат."
в C# целочисленное деление применяется с
/
когда и числитель и деноминатор являются целыми числами. В то время как, в VB.Net ' / ' приводит к делению с плавающей запятой, поэтому для целочисленного деления в VB.Net используйте\
. Взгляните на это MSDN post.