c# – 如何在IL中浮动和双重工作

当我们声明一个int变量时,例如:

int i = 4;

生成以下IL:

IL_0001:  /* 1A   |                  */ ldc.i4.4

我可以理解1A是16的十六进制表示,所以我理解正确的十六进制值被保存用于指代它的值或它意味着不同的东西?

当我声明一个双变量时:

double d = 12.34;

生成IL后,我无法得到一些东西:

IL_0003:  /* 23   | AE47E17A14AE2840 */ ldc.r8     12.34

23怎么样,它意味着什么,AE47E17A14AE2840在这里是什么?

当我声明一个具有相同值的浮点数时:

float f = 12.34f;

我现在有这个IL:

IL_000d:  /* 22   | A4704541         */ ldc.r4     12.34

这里也有同样的问题,22是什么,它意味着什么,A4704541是什么?

最佳答案
我认为理解ildasm告诉你的是很重要的.管道字符前面的字节是操作码的值,后面的字节是操作数或参数.

I can understand that 1A is the hexadecimal representation of 4, so am I understanding right that hexadecimal value is saved used to refer to value of it or it means something different?

在这种情况下,1A是ldc.i4.4操作码的值.此操作码是ldc.i4 4指令的快捷方式,它将导致绝对相同的行为,但将是5个字节长,1个字节操作码和4个字节参数.这些快捷方式对于从-1到8的int值存在,因为它们经常被使用,因此可以减小方法体的大小.

现在应该清楚你的浮点指令是如何形成的. 23和22是操作码,参数是IEEE 754编码的浮点数.

转载注明原文:c# – 如何在IL中浮动和双重工作 - 代码日志