我知道int和float在.Net框架中彼此别名为System.Int32和System.Float类型。但是我在System.Int32代码中找不到隐式转换为float代码System.Int32 source code in the .Net reference Source .在哪里可以找到实现代码?或者我应该搜索 Roslyn 代码以查找它如何检查隐式类型转换?
最佳答案
让我们退后一步,回顾一下 .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 位 intel、32 位 intel 和 ARM 上运行。不难理解,在 CPU 上运行的实际代码会因 CPU 不同而有所不同。
JIT(或即时编译器)负责将 IL 字节码转换为 objective-c PU 可以运行的实际 CPU 指令。
.net core的jit源码 can be found in github供您细读。我不知道在此之前有任何已发布的 .net jit 代码(即 .net core 出现之前的 .net 版本),我认为它是闭源的。
您必须自己搜索可用的代码,以找到您感兴趣的部分,但我想请您注意 genIntToFloatCast功能可以帮助您朝着正确的方向开始。这是针对 Amd64/x86 的。
关于c# - .Net框架如何实现int到float的转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37404606/