st 浮点栈寄存器的存储方式
问题描述:
我把1转成double压入st(0)中,按道理应该是3FF0000000000000,但x64dbg显示的是3FFF800000000000,我想用windbg看看是不是x64dg显示错误
过程:
我用windbg看了st(0),却发现结果也是3FFF800000000000,看来并不是x64dbg有问题,那么就有可能是st浮点栈寄存器并没有按照IEEE标准编码,随后我将2、3、4都压入st(0),观察值变化终于找到了规律
结果:
st浮点栈寄存器的双精度浮点编码方式是最高位为符号位,指数范围用15位表示,剩下48位表示尾数,但是和IEEE标准不同的是,最高位虽然恒为1,但也要加到尾数部分。
eg: 1 转成 双精度浮点
-
将1转成二进制数
1 = 1.0
-
因为1是正数,所以符号为0
指数为零 ,指数位为 32,767+0 = 011111111111111
尾数部分为100000000000000000000000000000000000000000000000
- 转化为十六进制为3FFF800000000000
补充: IEEE标准
IEEE标准的双精度浮点编码方式是最高位为符号位,指数范围用11位表示,剩下位数表示尾数,最高位1省略
例子:3F84000000000000 表示多少
将值转为二进制 0011 1111 1000 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
符号位
符号位为最高位 0 表示正数
指数位
011 1111 1000 十进制位为1016 指数的为011 1111 1000 - 011 1111 1111 = -7
尾数部分
0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
将省略的最高位补上
1.0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
转换位十进制
1*2^0 + 1*2^-2 = 1.25
所以结果为1.25 * 2^-7 = 0.009765625