.Net框架如何实现从int转换到float?

时间:2016-05-24 04:48:28

标签: c# .net casting compiler-construction type-conversion

我知道int和float彼此别名.Net framework中的System.Int32和System.Float类型。但是我无法在System.Int32代码{{3}中找到隐式转换为浮动代码我在哪里可以找到工具代码?或者我应该搜索Roslyn代码以找到它如何检查隐式类型转换?

2 个答案:

答案 0 :(得分:4)

让我们退后一步,回顾一下.net中的编译是如何工作的。您可以从高级语言开始,例如c#。在这种语言中,您可以编写类似

的内容
float Convert(int i) { return (float) i; }

C#编译器接受它并将其编译为clr二进制格式的可执行文件。在此二进制文件中,定位了代码的所有方法类和其他工件,方法代码由中间语言或IL中的字节码表示。 CLR基础设施的规范包括对IL的描述很容易获得。

如果我们将函数转换回人类可读形式,您的函数将转换为如下所示的字节代码:

ldarg.0 // load argument on stack
conv.r4 // take value from stack, convert it to 32bit float and put the result on stack
ret     //  return

这意味着您感兴趣的转换是在单个IL命令中实现的,即conv.r4

现在让我们记住.NET代码可以在各种CPU上运行。它可以在64位英特尔,32位英特尔和ARM上运行。不难理解,CPU上运行的实际代码会因CPU而异。

JIT(或即时编译器)负责将IL字节码转换为目标CPU可以运行的实际CPU指令。

.net core can be found in github的jit源代码供您阅读。我之前没有发现任何已发布的.net jit代码(也就是.net核心出现之前的.net版本),我认为它是封闭源代码。

您必须自己搜索可用的代码,找到您感兴趣的部分,但我想请您注意genIntToFloatCast功能,它可以帮助您从正确的方向开始。这是Amd64 / x86。

答案 1 :(得分:1)

似乎.NET将隐式类型转换留给了编译器,因为就我所知,转换函数可以做到这一点:

public static float ToSingle(int value) {
    return value;
}

正如您所看到的,没有显式的转换/转换为浮动 - 这表明.NET框架之外的其他东西处理它。

此处有更多信息 en.wikipedia.org/wiki/Type_conversion#Implicit_type_conversion