Anyone care to explain why these two pieces of code exhibit different results?
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
When you look at the IL-code that those two snippets produce, you'll realize that VB.NET first converts the integer values to doubles, applies the division and then rounds the result before it's converted back to int32 and stored in y.
C# does none of that.
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
C# IL Code:
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
The "proper" integer division in VB needs a backwards slash: p \ i
In VB, to do integer division, reverse the slash:
Dim y As Integer = p \ i
otherwise it is expanded to floating-point for the division, then forced back to an int
after rounding when assigned to y
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With