Почему приведение Int32 к Float64 вызывает изменение данных? - PullRequest
4 голосов
/ 16 февраля 2012

Я учу себя 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
}

1 Ответ

7 голосов
/ 16 февраля 2012

Console.Read возвращает кодовую точку Unicode или -1 для EOF.53 - это кодовая точка символа (не целое) '5'.

Возможно, вы можете использовать Console.ReadLine и int.Parse.

...