CLR如何在内部将Double / Single转换为Decimal?

时间:2014-12-04 12:37:47

标签: c# .net clr

我有兴趣了解.NET如何将Double/Single数据类型转换为Decimal,因此我开始研究我在下面的代码中遇到的Decimal类型结构源代码。

似乎所有其他类型的转换都是在框架的类库中实现的,除了double/float外,它们由CLR在外部处理。

所以,基本上问题是 CLR如何进行转换?

    [MethodImpl(MethodImplOptions.InternalCall)]
    public extern Decimal(float value);

    [MethodImpl(MethodImplOptions.InternalCall)]
    public extern Decimal(double value);

    public Decimal(int value)
    {
        int num = value;
        if (num < 0)
        {
            this.flags = -2147483648;
            num = -num;
        }
        else
        {
            this.flags = 0;
        }
        this.lo = num;
        this.mid = 0;
        this.hi = 0;
    }

    [CLSCompliant(false)]
    public Decimal(uint value)
    {
        this.flags = 0;
        this.lo = (int)value;
        this.mid = 0;
        this.hi = 0;
    }

    .
    .
    .

1 个答案:

答案 0 :(得分:5)

虽然它不像最新的CLR那样流行,但可以在先前发布的SSCLI 2(AKA Rotor)中确认一般细节。 System.Decimal的本机部分在clr \ src \ _vm \ comdecimal.cpp中实现。每个人分别拨打VarDecFromR4VarDecFromR8。这些是OleAut32.dll公开的本机API。

至于你的下一个问题:OleAut32如何实现这些功能?您最好的选择是附加调试器并反汇编函数。使用WinDbg,您可以使用uf命令执行此操作。