“小於等於”(<=)和“大於等於 ”(>=)的實現有一點復雜。實際上它們都具有2個融合在一起的條件。
在>=的情況 中,IL首先使用cgt指令來檢查第1個數字是否大於第2個數字。如果是,它將返回值1,否則就返回值0。 如果第1個條件是FALSE,那麼ceq指令將會檢查這2個數字是否相等。如果相等,它就返回TRUE,否則就返 回FALSE。
讓我們從一個稍微不同的角度來分析上面的IL代碼。我們對這兩個值19和16進行比較。 在這個例子中,因為19大於16,所以指令cgt將會把值1放到棧上。
讓我們在靜態構造函數中將字 段j的值修改為1。現在,由於數字1不大於16,所以cgt指令將把值FALSE或0放到棧上。此後,使用ldc指 令把另一個0放到棧上。現在當ceq指令比較兩個值時,因為它們都是0,所以它會返回TRUE。
現在 ,如果我們將j修改為16,cgt指令將返回FALSE,因為16不大於16。此後,由於使用ldc指令把值0放到棧 上,這兩個傳遞到ceq的值將都是0。由於0與0是相等的,所以返回值是1或TRUE。
如果你不能理解 上面的解釋,那麼就從源代碼中移除ldc.i4.0和ceq這兩行,並觀察輸出。
a.cs
class zzz
{
static bool i;
static int j = 19;
public static void Main()
{
i = j != 16;
System.Console.WriteLine(i);
}
}
a.il
.assembly mukhi {}
.class private auto ansi zzz extends System.Object
{
.fIEld private static bool i
.fIEld private static int32 j
.method public hidebysig static void vijay() il managed
{
.entrypoint
ldsfld int32 zzz::j
ldc.i4.s 16
ceq
ldc.i4.0
ceq
stsfld bool zzz::i
ldsfld bool zzz::i
call void [mscorlib]System.Console::WriteLine(bool)
ret
}
.method public hidebysig specialname rtspecialname static void .cctor() il managed
{
ldc.i4.s 19
stsfld int32 zzz::j
ret
}
}
Output
True