我听说使用<=
或>=
运算符时,编译器会自动对其进行优化,例如:(int)Variable >= 2
变为(int)Variable > 1
。浮点类型是否真的如此?在我看来,(float)Variable >= 2
不能优化到(float)Variable > 1.999999999
而不至于无穷大,要么导致它变得不可能,要么导致性能下降。 (我知道性能上的差异可能很小,但这只是我想知道的事情)
答案 0 :(得分:1)
如果您检查生成的IL代码,则不正确。例如,考虑以下类:
public class C
{
public void M()
{
float a = 4;
float b = 5;
bool result = a >= b;
}
}
生成的IL代码如下:
.class public auto ansi beforefieldinit C
extends [mscorlib]System.Object
{
// Methods
.method public hidebysig
instance void M () cil managed
{
// Method begins at RVA 0x2050
// Code size 22 (0x16)
.maxstack 2
.locals init (
[0] float32,
[1] float32,
[2] bool
)
IL_0000: nop
IL_0001: ldc.r4 4
IL_0006: stloc.0
IL_0007: ldc.r4 5
IL_000c: stloc.1
IL_000d: ldloc.0
IL_000e: ldloc.1
IL_000f: clt.un
IL_0011: ldc.i4.0
IL_0012: ceq
IL_0014: stloc.2
IL_0015: ret
} // end of method C::M
.method public hidebysig specialname rtspecialname
instance void .ctor () cil managed
{
// Method begins at RVA 0x2072
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method C::.ctor
} // end of class C
如果您阅读上面生成的IL代码(用作对IL命令this的引用),您会发现这不是正确的。
简而言之,在上面的IL代码中,将float
号装入堆栈,然后使用clt.un
操作,
如果value1
然后使用ceq
比较此操作的结果是否等于0,
如果value1等于value2,则按1(int32类型),否则按0。
,则上述结果分配给结果variable
。