MSIL - opcode conv.ovf.u8.un如何工作?

时间:2016-05-22 12:51:57

标签: 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.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 - 将unsigned转换为unsigned int64(在堆栈上为int64) 并在溢出时抛出异常。

因此-1(int32)被视为无符号为4294967295(uint32),并且它被视为uint64为18446744073709551615

Ecma文档说:http://postimg.org/image/4326dsysx/

二进制中再次-1(int32)是 111111111111111111111111111111111。 在通过零扩展转换后,它是 000000000000000000000000000000000111111111111111111111111111111111 它又是18446744073709551615

2 个答案:

答案 0 :(得分:1)

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

enter image description here

答案 1 :(得分:-1)

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

感谢提示!