为什么将Int32转换为Float64会导致数据发生变化?

时间:2012-02-15 20:48:01

标签: .net cil il

我正在教自己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
}

1 个答案:

答案 0 :(得分:7)

Console.Read返回Unicode代码点,或者返回-1表示EOF。 53是字符(非整数)'5'的代码点。

您可以使用Console.ReadLineint.Parse