MSIL - 操作码 conv.ovf.u8.un 如何工作?
MSIL - how opcode conv.ovf.u8.un work?
为什么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
.
我刚刚测试了它,在我的系统上它没有打印 -1 而是 18446744073709551615。
您能否提供有关您的系统(平台、.NET/CLR 版本)的更多信息,或者只是尝试使用 ilasm
再次构建可执行文件?
我更新了整个系统,重新启动,现在可以正常工作了。这非常有趣,因为在此之前我对其他操作码有疑问,例如conv.ovf.u8
现在一切正常。
感谢提示!
为什么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
.
我刚刚测试了它,在我的系统上它没有打印 -1 而是 18446744073709551615。
您能否提供有关您的系统(平台、.NET/CLR 版本)的更多信息,或者只是尝试使用 ilasm
再次构建可执行文件?
我更新了整个系统,重新启动,现在可以正常工作了。这非常有趣,因为在此之前我对其他操作码有疑问,例如conv.ovf.u8
现在一切正常。
感谢提示!