ldc.i4.s和ldc.i4有什么区别?

Pra*_*hal 11 .net c# il cil

我正在研究C#(IL)的中间语言,并且遇到了以下代码: -

//Add.il
//Add Two Numbers

.assembly extern mscorlib {}

.assembly Add
{
     .ver 1:0:1:0
}
.module add.exe

.method static void main() cil managed
{
    .maxstack 2
    .entrypoint

    ldstr "The sum of 50 and 30 is = "
    call void [mscorlib]System.Console::Write (string)

    ldc.i4.s 50
    ldc.i4 30    
    add
    call void [mscorlib]System.Console::Write (int32)
    ret
}
Run Code Online (Sandbox Code Playgroud)

我是理解IL的初学者,但我知道Main在上面的例子中使用的这些非常基本的指令的含义.

我的问题是,ldc.i4.s用于加载50的指令和ldc.i4用于将30加载到评估堆栈的指令之间是否存在任何差异.

编译器如何决定使用哪个指令(在这两个指令中)以及何时使用?

lep*_*pie 9

对于有符号字节值,没有.

ldc.i4.s是一种更有效的编码,用于将整数从-128推送到127到评估堆栈上.

请参阅MSDN