X86_64汇编指令,浮点数存储方式

delims 于 2020-08-01 发布

x86_64 汇编指令

imul rax,rbx ; rax = rax * rbx
imul rbx ; 

只有一个操作数时另一个操作数是rax , 高位保存在rdx,低位保存在rax
div rcx; 

rax = rdx / rcx , rdx = rdx % rcx
被除数在rdx和rax,高位和低位。
除数是指定操作数
商保存在 rax
余数保存在 rdx

类型 长度 符号位 指数位 小数部分
float
32
1
8
23
double
64
1
11
52

float 在内存中的存储方式

 | 1位符号 | 8位指数 | 23位尾数

我们来梳理一下 float 18.567在计算机中的存储是 1100253495

转成二进制后是

0 10000011 00101001000100100110111

第一位为0代表是正数,1为负数

10000011 的十进制是 131, 由于指数部分有正负之分,所以以127为界限,即真实的指数部分是 131 - 127 = 4

小数部分是 00101001000100100110111

加 1. 得到

1.00101001000100100110111

扩大 2^23 得到 100101001000100100110111

转成十进制是 9734455

缩小 2^23在乘以指数部分2^4也就等于是缩小 2^19

9734455 / 2^19 = 18.566999435424805

约等于 18.567 ,所以浮点数是不精确的。

关于指数的界限

float 类型 2^8 -1

double 类型 2^11 -1

也就是2的指数位数次幂 - 1