• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
K6-X4黑骑士君
博客园    首页    新随笔    联系   管理    订阅  订阅

为什么Java中long可以自动转换成float

Java中,long型是64位的,float型是32位的。为什么long型可以自动转float型呢?

这里就涉及到浮点数在内存中的存储问题了。对于byte,short,int,long四个整数类型而言,它们在内存中无一例外都是直接换算成二进制存储的,所以我们可以直接计算出它们的最大值。二进制的第一位是符号位不计算入数值,拿byte来说,数据存储形式就是0000-0000,一个字节占八位,除去第一位符号位外,后边全为1的话就是0111-1111,换算成十进制答案是127.

至于为什么最小的数是-128呢,这又有讲究了。计算机中负数是以补码形式存储的,一般说来,八位以内最小的负数应该是11111-1111,我们对其取反,结果就是1000-0000,再得到补码即1000-0001。是的,0001,补码是原码除符号位外逐位取反再加一的结果,但是对于补码而言1000-0001并不是八位二进制能表示的最小的数,最小的应该是1000-0000,对1000-0000求原码,就得到了1001-0000-0000,即我们十进制数的-128。同样的,对于short等其它整数类型也一样。

那么,float类型呢?4个字节,32位,第1位是符号位(数符),即S,接下来的8位是指数域(阶码),即E,最后的23位,是小数域(尾数),即M。对于一个十进制数112.5,我们用科学计数法表示就是1.12510^2,所以呢,对于一个二进制数,我们的表示就应该是1.XXX 2X,由于第一位永远都是1所以直接省去,因此表示为S.M*2E。所以float的取值范围是-2128到2128,远远大于long的最大值。

所以java中long类型自动转换为float类型。

简单来说因为浮点数用科学计数法存储的,而整数是用二进制存储的。所以虽然long型是64位的,float型是32位,但是float型所能表示的数要远远大于long型。

posted @ 2020-06-23 19:33  K6-X4黑骑士君  阅读(1711)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3