2014-12-04 5 views
2

Мне было интересно увидеть, как .NET преобразует типы данных Double/Single в Decimal, поэтому я начал изучать исходный код структуры типа Decimal, который я натолкнулся на код ниже.Как CLR конвертирует Double/Single to 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; 
    } 

    . 
    . 
    . 
+2

Как это реализовано в .NET Framework - это большая догадка без исходного кода ... но вы можете проверить, как это реализовано в Mono: https://github.com/mono/mono/blob/master/mcs/class/ corlib/System/Decimal.cs –

+0

Это, вероятно, разлагает число с плавающей точкой, и попытаться сопоставить его с ближайшим десятичным – leppie

+1

@AdrianoRepetti: \t \t [DllImport ("libdec", EntryPoint = "double2decimal")] \t \t частных статический ехЬегпом int double2decimal (out Decimal erg, double val, int digit); – leppie

ответ

5

Хотя это не так, как ток последнего CLR, общие сведения могут быть подтверждены в ранее выпущенном SSCLI 2 (AKA Rotor). Нативные части System.Decimal реализованы в clr \ src \ vm \ comdecimal.cpp. Каждый звонит VarDecFromR4 и VarDecFromR8, соответственно. Это собственные API, которые отображаются OleAut32.dll.

Что касается вашего следующего вопроса: как OleAut32 реализует эти функции? Лучше всего приложить отладчик и разобрать функции. С помощью WinDbg вы можете сделать это с помощью команды uf.

+0

спасибо, ваша информация привела меня к проверке реализации вина http://source.winehq.org/source/dlls/oleaut32/vartype.c – user3473830