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

标签 c# .net clr

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

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

所以,基本上问题是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;
    }

    .
    .
    .

最佳答案

虽然它不如最新的 CLR,但一般细节可以在之前发布的 SSCLI 2(AKA Rotor)中得到确认。 System.Decimal 的 native 部分在 clr\src\vm\comdecimal.cpp 中实现。每个电话VarDecFromR4VarDecFromR8 , 分别。这些是由 OleAut32.dll 公开的 native API。

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

关于c# - CLR 如何在内部将 Double/Single 转换为 Decimal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27294309/

相关文章:

c# - 避免与 datagridview WPF 重叠

c# - 哪个是最佳实践 : MethodReturnsBoolean == true/false OR true/false == MethodReturnsBoolean

C# 派生类,重载解析

c# - 使用 MVVM 的 BusyIndi​​cator

.net - 他们是否在 Rx 3.0 中删除了 Interval 和 Timer 运算符?

c++ - 如何从托管 C++ 调用非托管 dll

c# - ASP.NET MVC : is it a good idea to return a File result from a byte[]?

c# - Roslyn 会成为 .NET 框架的一部分吗?

c# - 为什么 GetHashCode 在 Object 类中?

c# - 参数数量未知的 Func<>