zoukankan      html  css  js  c++  java
  • float在内存中的存取方法

    今天做了一些题目,想到float数据如何在内存中的形式。不知道一个浮点数是如何存成32位01字符串的。下面是查找的一些资料。

    我们先通过java获取这些数的二进制表示。

    public class Dec {
        public static void main(String[] args) {
            System.out.println(Integer.toBinaryString(Float.floatToIntBits(-1.5f)));
            System.out.println(Integer.toBinaryString(Float.floatToIntBits(-2.5f)));
            System.out.println(Integer.toBinaryString(Float.floatToIntBits(-3.5f)));
            System.out.println(Integer.toBinaryString(Float.floatToIntBits(-4.5f)));
            System.out.println(Integer.toBinaryString(Float.floatToIntBits(-5.5f)));
            System.out.println(Integer.toBinaryString(Float.floatToIntBits(-6.5f)));
        }
    }

    我们的结果是

    10111111110000000000000000000000
    11000000001000000000000000000000
    11000000011000000000000000000000
    11000000100100000000000000000000
    11000000101100000000000000000000
    11000000110100000000000000000000

     我们通过分析数字17.625来看浮点数的存储方式:

    17转换为二进制就是10001。

    0.625转换为二进制就是0.101

    所以17.625转换为二进制就是10001.101,表示为指数形式就是1.0001101*(2^4)

    底数部分M,因为小数点钱必为1,所以IEEE规定只记录小数点后的就好,所以此处的底数为0001101。

    指数部分E,实际为4,但是需要加上127,固定位131。即二进制数10000011。

    符号部分S,由于是正数,所以S为0。

    综上所述,17.625的存储方式为

    0 10000011 00011010000000000000000

    下面分析一下-1.5的二进制

    1.5的二进制表示为1.1,1.1=1.1*(2^0)

    所以底数部分M,为1,指数部分为0+127,表示为二进制位01111111

    符号部分S,由于是负数,所以S为1。

    所以为1 01111111 10000000000000000000000

    解释:

    浮点型变量在计算机内存中专用4字节(Byte),即32-bit。遵循IEEE-754格式标准。

    一个浮点数由2部分组成:底数m和指数e

    底数部分  使用2进制数老表示此浮点数的实际值

    指数部分  占用8-bit的二进制数,可以表示数值范围0-255.但是指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float的指数可以从-126到128。

    底数部分实际上是占用24-bit的一个值,由于其最高位始终为1,所以最高位省去不存储,在存储中只有23-bit。

    到目前为止,底数部分23位,加上指数部分8位使用了31位,那么前面说过,float是占用4字节即32-bit,那么还有一位是干嘛用的呢?还有一位,其实就是4字节中的最高位,用来指示浮点数的正负,当最高位是1时,为负数。当最高位为0时,为正数。

    浮点数就是按照以下方式存储的。

    Address+0 Address+1 Address+2 Address+3
    SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

    其中S表示浮点数的正负。1为负数,0为正数。

    E:指数加上127后的数值的二进制

    M:24-bit的底数(只存23-bit)

    注意:这里有一个特例,浮点数为0时,指数和底数都是0,但此前的公式不成立。因为2的0次方等于1.所以,0是个特例。

    当然,这个特例也不用认为去干扰,编译器会自动识别。

  • 相关阅读:
    Vue 导出excel 自适应宽度
    .Net 5.0 项目数据库连接字符串
    .Net 5.0 从api下载文件到本地
    Oracle for 循环输出(游标提取)
    找到多个与名为“Home”的控制器匹配的类型
    让tomcat使用指定JDK
    .NetCore 3 单文件发布详解
    CentOS7 常用命令大全
    阿里云ECS CentOS 7.8 安装图形化桌面GNOME
    用命令禁用本地连接
  • 原文地址:https://www.cnblogs.com/LoganChen/p/8679065.html
Copyright © 2011-2022 走看看