• 数据在内存中的存储(2)


    目录

    浮点型在内存中的存储

    一、浮点型数字的二进制

    二、浮点型在内存中的存储形式

    1、浮点型的二进制规范写法:

    1.1、普通写法:

     1.2、科学计数法:

    1.3、根据国际标准IEEE(电气和电子工程协会) 754的写法: 

    2、浮点型在内存中的存储方式:

    关于S:

    关于M:

     关于E:

    转化案例: 

    3、关于取出浮点数再内存中的数据

    3.1、E不全为0或不全为1

    3.2、E全为0

    3.3、E全为1

    练习 



    浮点型在内存中的存储

    一、浮点型数字的二进制

    浮点型数字的二进制形式转化为十进制其实也是和整数型数字转化为二进制一样,通过权重进行运算。


    权重详情:http://t.csdn.cn/dw8tX

    • 但不同的是浮点型数字的小数部分。

    例如,数字5.5

    它的整数部分是5,转化为二进制是101,而小数部分是0.5,拿0.5这么转化为二进制呢? 

    其实,小数部分也和权重有关,如下图所示:

    小数点的右边一位的权是2的-1次方,所以权重是2的-1次方乘1,也就是得到数字0.5

    而小数点的右边的第二位的权是2的-2次方,所以权重是2的-2次方乘1,得到数字0.25

    所以进制的小数部分是0.5+0.25=0.75

    二、浮点型在内存中的存储形式

    1、浮点型的二进制规范写法:

    1.1、普通写法:

    如上文所诉,我们可以得知了5.5的二进制运算法则,那么5.5这个浮点型数字的二进制这么表达呢?

    其实上文也有展示,这其实就和普通浮点型的表达形式一样,用小数点将整数部分的二进制和小数部分的二进制分开。

    例如:V = 5.5  它的二进制表达数为,101.1 其中小数点将整数和小数部分隔开,也因此,我们也可以直到那个是小数部分的权,那个是整数部分的权。

     1.2、科学计数法

    对于浮点数而言,科学计数法是一个十分方便的写法。

    例如:123.45可以写为1.2345*10^2 将小数点朝前移动两位,并乘上10的2次方,使得整数只剩下一位。

    • 而在浮点数的二进制形式中也可以这样写。
    • 例如:V = 5.5 它的二进制写法是101.1 那么使用科学计数法则是 1.011*2^2  和十进制一样,将小数点往前移动两位,但因为是二进制,由于满二进1的原则,所以这里乘的是2的二次方,这和10的2次方是一个道理。
    1.3、根据国际标准IEEE(电气和电子工程协会) 754的写法: 

     

    其实,这就是科学计数法的一种升级版。

    在科学计数法的基础上增加了一个符号位,也就是(-1)^ s 

     (-1)^ s 表示的是一个正负号,当s为0时表达是正数,当s为1时表达的是负数。

    例如:

    • V = 5.5
    • 因为5.5是一个正数,所以s为0
    • 所以写法如下:(-1)^ 0 * 1.011 * 2 ^ 2
    • 其中 0 = s       1.11 = M        2^2中的第二个2 表示E  

    又例如:

     

    2、浮点型在内存中的存储方式:

    在IEEE754的规范标准下,浮点型在内存中其实只要存储,S、E、M等即可。

    关于S:

    因为S只是表达正负,所以S存储的是0或1,0表达正数,1表达负数

    关于M:

    为了将M的存储更为简便,或者说提高精度,我们在存储时只存储小数部分。

    例如:

    • V = 5.5 二进制表达方式是 101.1 科学计数法是 1.011,而M在内存中只存储011这个。
    • 而又因为,M在内存中占有23个比特位或者是52个比特位,因此未占满的部分使用0代替。
    • 而只存储小数部分的原因是,通过科学计数法,我们留下了一位整数,这位整数在科学计数法的情况下必然是1,所以我们默认将1省略,只有取出存储数据的时候才会加上。
     关于E:

    E的情况较为复杂,因为E必须是一个无符号的整型数值,但是作为科学计数法的E是会出现负数的。

    例如:

    所以,这时候我们就出现了一个中间值! 

    • 32位浮点数的中间值是127,64位数浮点数的中间值是1023。
    • 当我们的E存入数据中时,必须先加入127或者1023,然后变成二进制形式。 
    •  注意,加上中间值是基本都能修正好这个问题的。

    转化案例: 

    V = 5.5  ——十进制

    V = 101.1  —— 二进制

    V = 1.011*2^2 ——科学计数法

    V =  (-1)^ 0 * 1.011 * 2 ^ 2  —— IEEE754

    V =  0 10000001  011 00000000000000000000

    V =  4 0 b0 00 00 ——数据存储再内存后,使用16进制再内存块中的展示

    ————以小端字节进行展示! 

    3、关于取出浮点数再内存中的数据

    关于取出数据,只需要观察E的情况。

    3.1、E不全为0或不全为1

    这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1

    比如:

    0.5 的二进制形式为0.1

    • 由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1)。
    • 其E再内存应该先为-1+127(中间值)=126,表示为01111110。
    • 而M = 1.0 则去掉整数部分为0,补齐0到23位00000000000000000000000。

    所以其最后二进制表示形式为: 

     

    3.2、E全为0

    全0情况,存储在内存中是加了127或者1023的,而这种加了后还全0的情况那么E就是-127或者-1023,所以这种数字(整个浮点数)表示的就是无限接近与0的数。

    那么这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示+0,以及接近于0的很小的数字。

    3.3、E全为1

    这时,如果有效数字M全为0,表示无穷大(正负取决于符号位s)。 

    练习 :

    • 整数9再内存中的存储是二进制的补码状态,使用整数取出打印很正常,答案也是9 
    • 但是被取地址后强制转化为float类型后 9的二进制补码会按照浮点数再内存中的寄存方式,也就是IEEE754的寄存方式进行寄存。
    • 最前一位是符号位S,后八位是有效数E,E,为科学计数法的E,二进制转化为十进制后需要减去127得到 ,而最后的23位则是M也就是浮点数的小数部分的二进制,再取出后需要再前面+1和小数点。

      

     三段分别是 S、E、M,且E为全0,说明无限接近于0,所以最后编译器打印出来是0。

    注意:这里M取出后,整数部分为0是根据了E全为0的规则而整出来的。

    而再浮点数部分则是:

     

    浮点数数字用整型打印结果如下:

     

  • 相关阅读:
    Linux下lt9611调试总结资料分享
    关键词生成原创文章软件-原创文章生成软件
    JAVA中的基本数据类型
    2024最新算法:冠豪猪优化算法(Crested Porcupine Optimizer,CPO)求解23个基准函数(提供MATLAB代码)
    IDEA使用中, 设置平展软件包。使用IDEA遇到的问题:src里为什么创建包为什么不在包里面
    学生HTML个人网页作业作品 使用HTML+CSS+JavaScript个人介绍博客网站 web前端课程设计 web前端课程设计代码 web课程设计
    [附源码]Python计算机毕业设计Django网文论坛管理系统
    6. N 字形变换
    算法练习|Leetcode49字母异位词分词 ,Leetcode128最长连续序列,Leetcode3无重复字符的最长子串,sql总结
    波奇学C++:哈希
  • 原文地址:https://blog.csdn.net/2301_76445610/article/details/132889506