Я учу себя 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 как float И преобразованный 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 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
}