【问题标题】:Binary Representation of Float in Assembly Language汇编语言中浮点数的二进制表示
【发布时间】:2017-07-13 13:19:26
【问题描述】:

我正在学习汇编语言及其数据类型,遇到了.float。我声明了一个名为Float.float 变量,并将其值指定为10.23。我使用 GNU assembler v2.28 来组装它,然后使用 GNU Linker v2.28 来链接目标文件以创建可执行二进制文件。这是我的程序:

.data
    HelloWorld:
        .ascii "Hello World!\n"
    ByteLocation:
        .byte 10
    Int32:
        .int 2
    Int16:
        .short 5
    Float:
        .float 10.23
    IntArr:
        .int 3,6,7,8,10

.bss
    .comm LargeBuffer, 1000

.text
    .globl _start
    _start:
        nop    
        movl $1, %eax
        movl $0, %ebx
        int $0x80

我使用 GDB 调试器设置断点。

(gdb) break *_start+1 Breakpoint 1 at 0x4000b1: file 03 VariableDemo.s, line 22.

当我查看Float 的十进制表示和二进制表示时。我发现了这个:

(gdb) x/1bw 0x0000000000600139 0x600139: 10.2299995 (gdb) x/1tw 0x0000000000600139 0x600139: 01000001001000111010111000010100

我指的是 Can anyone explain representation of float in memory? 将二进制表示转换回 10.23。这是我的计算:

第一位 = 1 => 浮点数为正数。

接下来的 8 位 = 10000010 => 将 +2 表示为有效数的乘数。

接下来的 23 位 = 01000111010111000010100 => 以 2 的负幂转换后得到 0.278749943

但是 0.278749943*2 不是 10.23。所以现在我想到了 2 个问题。

  1. 为什么文本中的 10.23 在内存中表示为 10.2299995。
  2. 我的计算哪里出错了?

【问题讨论】:

标签: assembly floating-point


【解决方案1】:
  1. 转换错误,并不是所有在 base 10 中“不错”的东西在 base 2 中都会不错。
  2. 指数偏差是 127 而不是 128,所以这是 +3 而不是 +2
  3. 您实际上需要使用指数,所以这是*2^3 而不仅仅是*2
  4. 你忘记了隐含的前导1位,所以你需要在尾数后面加上1,这意味着你有1.278749943*2^3=10.2299995

【讨论】:

  • 存储的指数是 130,您声称这意味着 +2,但实际上意味着 +3,因为您需要减去 127 而不是 128。链接的答案是错误的,wikipedia(和你的电脑)是正确的。
  • 感谢您的解释!
【解决方案2】:

尾数有一个隐含的前导1,所以它总是二进制1.xxxxxxx。然后根据指数左移或右移(指数是有偏差的而不是二进制补码,所以127等于零位移,或者1.xxxxx,128代表1x.xxxx等等)。

最后将二进制转换为denary输出。

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 2021-10-02
    • 1970-01-01
    • 2016-05-01
    • 2018-04-10
    • 1970-01-01
    • 2021-12-18
    • 2016-01-01
    • 2015-12-02
    相关资源
    最近更新 更多