今天做了一些题目,想到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是个特例。

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

float在内存中的存取方法的更多相关文章

  1. Float在内存中的存储方式及IEC61131处理

    Float在内存中的存储方式及IEC61131处理 1,fp32(32bits float)类型数据在存储器中占用4Bytes存储,且遵循IEEE-754标准: 一个浮点数分三部分组成: 符号位s(1 ...

  2. float 在内存中如何存储的

    float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准:    一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进制数, ...

  3. C语言中,float在内存中的储存方式

    浮点型变量在计算机内存中占用4字节(Byte),即32-bit. 遵循IEEE-754格式标准. 一个浮点数由2部分组成:底数m 和 指数e. ±mantissa × 2exponent (注意,公式 ...

  4. float在内存中的存放

    一个float型实数在内存中占4个字节,即32个二进制bit,从低位到高位依次叫第0位到第31位.这32位可以分为3个部分:符号位(第31位),阶码(第30位到第23位共8位),尾数(最低23位). ...

  5. 如何查看float在内存中存储方式

    float fla = -1000; unsigned int *pfla = (unsigned int*)&fla; printf("fla=%X\n",*pfla); ...

  6. float在内存中如何存储?

    float为浮点型,32位机器中占4字节共32bit,下标0-31. 31 位:符号位,正数为0,负数为1. 30 位:方向位.小数点左移位1,右移为0. 23-29:共7位,指数位.=指数-1. 0 ...

  7. C语言 float、double数据在内存中的存储方式

    float在内存中占4个字节(32bit),32bit=符号位(1bit)+指数位(8bit)+底数位(23bit) 指数部分 指数位占8bit,可以表示数值的范围是0-(表示0~255一共256个数 ...

  8. long类型在内存中占8个字节,float类型在内存中占4个字节,为什么long还要比float小呢?

    结论:数值范围大小和占用的字节没有关系. float类型的范围: 负数:-3.402823E38~-1.401298E-45 整数:0 正数:1.401298E-45~3.402823E38 long ...

  9. float和double在内存中的存储方式

    本文转载于:http://wenku.baidu.com/link?url=ARfMiXVHCwCZJcqfA1gfeVkMOj9RkLlR9fIexbgs9gDdV8rIS48A1_xe1y6YgX ...

随机推荐

  1. 基于SQL调用Com组件来发送邮件

    这个需求是公司有个文控中心,如果有用增删改了文件信息希望可以发邮件通知到有权限的人.当然方式很多. 这里是用数据库作业来完成 JOB+Com,这里用的com组件是Jmail 当然你需要把com组件放到 ...

  2. Delphi使用Indy、ICS组件读取网页

    使用Indy 10中TIdHTTP的例子: 代码 uses IdHttp; . . . function HttpGet(const Url: string; var Html: string): B ...

  3. Delphi2010中DataSnap高级技术(转)

    一. 为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7该下岗了. DataSnap有三种服务模式,其 ...

  4. 要会的123个Python工具!

    本文中列举了123个Python渗透测试工具,当然不仅于渗透~ Network 调试和逆向工程 模糊测试 Web 取证 Volatility: 从 RAM 中提取数据 Rekall: Google 开 ...

  5. jenkins使用HTML Publisher Plugin插件 拉取报告样式缺失问题解决

    ---------------------------------------------------------临时解决方案----亲测ok 要解决该问题,方式也比较简单,就是修改Content S ...

  6. json、pickle\shelve模块(超级好用~!)讲解

    json.pickle模块讲解 见我前面的文章:http://www.cnblogs.com/itfat/p/7456054.html shelve模块讲解(超级好用~!) json和pickle的模 ...

  7. python开发模块基础:re正则

    一,re模块的用法 #findall #直接返回一个列表 #正常的正则表达式 #但是只会把分组里的显示出来#search #返回一个对象 .group()#match #返回一个对象 .group() ...

  8. MMU段式映射(VA -> PA)过程分析

    MMU:内存管理单元. CPU寻址的方式: 未使用MMU:CPU发出地址(PA) 直接内存寻址(SDRAM or DDRx). 使用MMU  :CPU发出地址(VA) MMU接收CPU发来的地址 经过 ...

  9. 使用Docker模拟ansible集群环境

     /etc/ansible/hosts 192.168.99.100 ansible_ssh_port=8081 ansible_ssh_user=root 配置容器免密码SSH登录

  10. ThreadStart中带参数

    Thread Hand1 = new Thread(() =>        {            MethodName(参数1, 参数2);        });        Hand1 ...