我正在教自己CIL并且到目前为止一直做得很好(昨天刚刚开始)但是我遇到了一个我无法弄清楚的问题。我正在提示用户输入一个int(int32),然后将其存储并转换为浮点并显示它。然而,无论我输入什么都是不同的浮动。这是我的代码:
.assembly variables {}
.method public static void main() cil managed
{
.entrypoint
.maxstack 8
.locals init (float64)
ldstr "Enter a digit: "
call void [mscorlib]System.Console::WriteLine(string)
call int32 [mscorlib]System.Console::Read()
conv.r8
stloc.0
ldstr "as a float: "
call void [mscorlib]System.Console::WriteLine(string)
ldloc.0
dup
call void [mscorlib]System.Console::Write(float64)
stloc.0
ldstr "Stored in location 0"
call void [mscorlib]System.Console::WriteLine(string)
ldloc.0
conv.i4
call void [mscorlib]System.Console::WriteLine(int32)
call int32 [mscorlib]System.Console::Read() // to pause before closing window
pop
ret
}
我只是在和CIL一起玩弄,但我觉得为了清晰起见,我会抛弃我的整个例子。它编译得很好但是当我输入5时它返回53作为浮点数和转换后的int32。
有人可以说清楚我做错了什么!
编辑:感谢Marc Gravell我能够弄明白。对于那些感兴趣的人,这里是正确的代码:
.assembly variables {}
.method public static void main() cil managed
{
.entrypoint
.maxstack 8
.locals init (float64)
ldstr "Enter a digit: "
call void [mscorlib]System.Console::WriteLine(string)
call string [mscorlib]System.Console::ReadLine()
call int32 [mscorlib]System.Int32::Parse(string)
conv.r8
stloc.0
ldstr "as a float: "
call void [mscorlib]System.Console::WriteLine(string)
ldloc.0
dup
call void [mscorlib]System.Console::Write(float64)
stloc.0
ldstr "Stored in location 0"
call void [mscorlib]System.Console::WriteLine(string)
ldloc.0
conv.i4
call void [mscorlib]System.Console::WriteLine(int32)
call int32 [mscorlib]System.Console::Read() // to pause before closing window
pop
ret
}
答案 0 :(得分:7)
Console.Read
返回Unicode代码点,或者返回-1表示EOF。 53是字符(非整数)'5'
的代码点。
您可以使用Console.ReadLine
和int.Parse
。