c# - .Net框架如何实现int到float的转换?

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

我知道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/

相关文章:

c# - 读取 ASN.1 DER 编码的 RSA 公钥

.net - WCF 客户端证书停止工作

c# - 我应该为每个模型都有一个封装的 ViewModel 吗?

c# - 从 C# 中的未知类型转换

c# - 将 gridview 与我的 getall 方法绑定(bind) - Entity Framework

c# - 如何使用鼠标指针和键盘快捷键捕获文本?

c# - 调用时无法将 lambda 表达式转换为类型 'System.Delegate'

c# - 这在技术上是 "Hello World"的 O(1) 算法吗?

c++ - 如何检查从 C++ 字符串到 unsigned int 的转换

c++ - const_cast<> 在 volatile 上的目的是什么?