我有兴趣了解.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;
}
.
.
.
答案 0 :(得分:5)
虽然它不像最新的CLR那样流行,但可以在先前发布的SSCLI 2(AKA Rotor)中确认一般细节。 System.Decimal的本机部分在clr \ src \ _vm \ comdecimal.cpp中实现。每个人分别拨打VarDecFromR4和VarDecFromR8。这些是OleAut32.dll公开的本机API。
至于你的下一个问题:OleAut32如何实现这些功能?您最好的选择是附加调试器并反汇编函数。使用WinDbg,您可以使用uf命令执行此操作。