深圳Java培训:Java中的float在内存中的存储

深圳 Java 培训: Java 中的 float 在内存中的存储

 

最近在讲 Java 基础,讲到数据类型的转换,提到整数类型长字节类型数据放到短字节类型数据中时,由于字节数不够,会截断数据,所以需要程序员手动强制类型转换,例如将 int 型的数据放到 byte 类型中。

后来学生提出一个问题,为什么 float 只有 4 个字节,而 long 8 个字节,将一个 long 数据放入到一个 float 中时不需要强制转换,而将 float 放到 long 中却需要强制转换呢?

要理解这个问题,首先我们要知道 float 中可以存储小数,而 long 只能存储整数,所有 float 的数据放到 long 里需要强制转换。

至于为什么 long 放到 float 里不需要强制转换,需要了解 float 存储数据的机制, float 中存储数据的时候是以科学计数法的方式计数的,所有能够存储的整数大小要超过 long 类型,于是 long 数据放到 float 中是没有问题的,只是可能会误差很大而已。

具体来说, float 中存储一个数字时,是按照这样做的:

float 4 个字节,即 32 bit

32         31          30-24      23-1

符号位    指数符号位       指数       数字

1. 10 进制的小数转换成 2 进制的小数。

2. 将小数点移动(左移或右移 n 位)到第一个数字 1 后,得到一个类似 1.01001 这样的一个二进制小数 m

3. 根据小数的正负将第 32 位(最高位)的符号位填充,正数为 ,负数为 1

4. 根据移动的方向确定第 31 位的值,如果向左移则为 1 ,向右移或者不动为

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 的第 32

因为往左移,所以第 31 位为: 1

因为往左移了 3 位, 3-1=2 ,所以第 30-24 位为: 0000010

最后,将小数点后面的数字截断 23 位,所以第 23-1 位为: 1000001   10011001   10011001

最终 12.1 表示成 2 进制在内存中保存为: 0  1  0000010   1000001   10011001   10011001


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69942977/viewspace-2652480/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69942977/viewspace-2652480/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值