【发布时间】: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 个问题。
- 为什么文本中的 10.23 在内存中表示为 10.2299995。
- 我的计算哪里出错了?
【问题讨论】:
-
对于 1. 请阅读:floating-point-gui.de