Code
int a, b;
a = Convert.ToInt32(18.8);//输出为19
b = (int)18.8;//输出为18
生成的IL部分代码
Code
1 .maxstack 3
2 .locals init (
3 [0] int32 a,
4 [1] int32 b)
5 L_0000: ldc.r8 18.8
6 L_0009: call int32 [mscorlib]System.Convert::ToInt32(float64)//Convert.ToInt32(18.8)所调用的方法
7 L_000e: stloc.0
8 L_000f: ldc.i4.s 0x12
9 L_0011: stloc.1
10 L_0012: ldarg.0
11
我们从IL代码我们看到
(int)18.8这个直接把值转换为了18
而Convert.ToInt32(18.8)(IL中的第8行)他在IL代码中却调用了Convert.ToInt32()函数(IL中的第6行)
然后我们通过Reflector工具看一下Convert.ToInt32()方法里为我们做了些什么
Code
1 public static int ToInt32(double value)
2 {
3 if (value >= 0.0)
4 {
5 if (value < 2147483647.5)
6 {
7 int num = (int) value;
8 double num2 = value - num;
9 if ((num2 > 0.5) || ((num2 == 0.5) && ((num & 1) != 0)))
10 {
11 num++;
12 }
13 return num;
14 }
15 }
16 else if (value >= -2147483648.5)
17 {
18 int num3 = (int) value;
19 double num4 = value - num3;
20 if ((num4 < -0.5) || ((num4 == -0.5) && ((num3 & 1) != 0)))
21 {
22 num3--;
23 }
24 return num3;
25 }
26 throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
27 }
28
29
30
31
32
首先做了一个范围类型检查,假如超出范围就抛出OverflowException异常,
假如符合条件,进行四舍五入计算
希望能给大家些帮助