好程序员-千锋教育旗下高端IT职业教育品牌

400-811-9990
  • 客服QQ
  • 官方微信

    好程序员

    专注高端IT职业培训

[JavaEE] 好程序员Java学习路线float在内存中的存储

[复制链接]
527 0
叶子老师 发表于 2019-8-1 11:24:04 | 只看该作者 |阅读模式 打印 上一主题 下一主题
好程序员Java学习路线float在内存中的存储最近在讲Java基础,讲到数据类型的转换,提到整数类型长字节类型数据放到短字节类型数据中时,由于字节数不够,会截断数据,所以需要程序员手动强制类型转换,例如将int型的数据放到byte类型中。
        后来学生提出一个问题,为什么float只有4个字节,而long8个字节,将一个long数据放入到一个float中时不需要强制转换,而将float放到long中却需要强制转换呢?
        要理解这个问题,首先我们要知道float中可以存储小数,而long只能存储整数,所有float的数据放到long里需要强制转换。
        至于为什么long放到float里不需要强制转换,需要了解float存储数据的机制,float中存储数据的时候是以科学计数法的方式计数的,所有能够存储的整数大小要超过long类型,于是long数据放到float中是没有问题的,只是可能会误差很大而已。
        具体来说,float中存储一个数字时,是按照这样做的:
        float4个字节,即32bit
  32         31          30-24      23-1
  符号位   指数符号位      指数      数字
        1. 10进制的小数转换成2进制的小数。
        2. 将小数点移动(左移或右移n位)到第一个数字1后,得到一个类似1.01001这样的一个二进制小数m
  3. 根据小数的正负将第32位(最高位)的符号位填充,正数为0,负数为1
  4. 根据移动的方向确定第31位的值,如果向左移则为1,向右移或者不动为0
  5. 如果是向左移,将n-1后转换成2进制,并在左边补零到7位长度,填充到30-24位的指数位上。如果是不动或向右移,将n转换成2进制,并在左边补零到7位长度,并每一位求反填充到30-24位。
  6. 将数字m去掉整数位和小数点后,截断23位长度填充到23-1位。
  
例如:数字12.1
转换成2进制后为:1100.0001100110011001100110011001100110011001100110011
将数字往左移3位为:1.1000001100110011001100110011001100110011001100110011
因为数字12.1为正数,所以float的第320
因为往左移,所以第31位为:1
因为往左移了3位,3-1=2,所以第30-24位为:0000010
最后,将小数点后面的数字截断23位,所以第23-1位为:1000001 10011001 10011001
最终12.1表示成2进制在内存中保存为:0  1  0000010  1000001 10011001 10011001
好程序员Java培训官网:http://www.mygod78.com/

精彩内容,一键分享给更多人!
收藏
收藏0
转播
转播
分享
淘帖0
支持
支持0
反对
反对0
您需要登录后才可以回帖

本版积分规则

关注我们
千锋好程序员

北京校区(总部):北京市海淀区宝盛北里西区28号中关村智诚科创大厦

深圳西部硅谷校区:深圳市宝安区宝安大道5010号深圳西部硅谷B座A区605-619

杭州龙驰智慧谷校区:浙江省杭州市下沙经济技术开发区元成路199号龙驰智慧谷B座7层

郑州校区:郑州市二七区航海中路60号海为科技园C区10层、12层

Copyright 2007-2019 北京千锋互联科技湖南福彩网 。All Right

京ICP备12003911号-5 京公安网11010802011455号

请您保持通讯畅通1对1咨询马上开启

辽宁福彩网 江苏福彩网 江苏福彩网 江苏福彩网 湖南福彩网 湖南福彩网 江苏福彩网 上海福彩网 湖南福彩网 上海福彩网