我正在学习汇编语言及其数据类型并遇到.float
。我声明了一个名为.float
的{{1}}变量,并将其值指定为Float
。我使用GNU汇编程序v2.28来组装它,然后使用GNU Linker v2.28链接目标文件以创建可执行二进制文件。这是我的计划:
10.23
我使用GDB调试器设置了一个断点。
.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) break *_start+1
Breakpoint 1 at 0x4000b1: file 03 VariableDemo.s, line 22.
的十进制表示和二进制表示时。我发现了这个:
Float
我引用Can anyone explain representation of float in memory?将二进制表示转换回10.23。这是我的计算:
第一位= 1 =>浮点是积极的。
接下来的8位= 10000010 =>表示+2作为有效数的乘数。
next 23 bits = 01000111010111000010100 =>当使用2的负幂转换时,给出0.278749943
但是0.278749943 * 2不是10.23。所以现在我想到了两个问题。
答案 0 :(得分:3)
+3
而不是+2
*2^3
不仅仅是*2
1
位,因此您需要将1
添加到尾数中,这意味着您有1.278749943*2^3=10.2299995
答案 1 :(得分:0)
尾数有一个隐含的前导1,所以它总是二进制1.xxxxxxx。然后根据指数进行左移或右移(指数偏置而不是二进制补码二进制数,因此127等于零移位,或1.xxxxx,128表示1x.xxxx等等)。
最后,二进制转换为denary以便输出。