C# MSIL-操作码conv.ovf.u8.un如何工作?

C# MSIL-操作码conv.ovf.u8.un如何工作?,c#,cil,C#,Cil,为什么msil程序: .assembly Test {} .method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 21 (0x15) .maxstack 2 .locals init ([0] int32 a, [1] int32 b) IL_0000: nop IL_0001: ldc.i4.

为什么
msil
程序:

.assembly Test {}
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       21 (0x15)
  .maxstack  2
  .locals init ([0] int32 a,
           [1] int32 b)
  IL_0000:  nop
  IL_0001:  ldc.i4.m1
  IL_0002:  stloc.0
  IL_0003:  ldloc.0
  IL_0005:  conv.ovf.u8.un
  IL_0006:  stloc.1
  IL_0007:  ldloc.1
  IL_0008:  call       void [mscorlib]System.Console::WriteLine(uint64)
  IL_000d:  nop
  IL_000e:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
  IL_0013:  pop
  IL_0014:  ret
} // end of method Program::Main
写入输出:
-1

conv.ovf.u8.un
-将无符号转换为无符号int64(在堆栈上作为int64) 并在溢出时抛出异常

因此,
-1
(int32)被视为无符号的是
4294967295
(uint32),被视为uint64的是
18446744073709551615

Ecma文件说明:

所以同样地,二进制的
-1
(int32)是
111111111111111111111
。 通过零扩展进行转换后,它是
000000000000000000000111111111111111111

同样是18446744073709551615

我刚刚测试了它,在我的系统上它没有打印-1,而是18446744073709551615。
您是否可以提供有关您的系统(平台、.NET/CLR版本)的更多信息,或者尝试使用
ilasm
重新构建可执行文件


我更新了整个系统,重新启动,现在它工作正常。这非常有趣,因为之前我对其他操作码有问题,例如
conv.ovf.u8
,现在一切都正常了

谢谢你的提示