ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java中long类型为何会自动转换为float类型?

2021-08-04 22:02:22  阅读:150  来源: 互联网

标签:0000 字节 float long Java byte 1000


一直只知道java有八种基本数据类型,byte, short, int, long ,boolean , char , float和double。其中byte占一个字节short两个字节int四个字节long八个字节,boolean一个字节char两个字节float四个字节double八个字节。但是对于数据类型的转换还是有点蒙。byte, short , char—>int—>long—>float—>double(记得不错的话应该是这样的),其他的都好理解,因为自动数据类型转换都是由精度低的往精度高的转换,但是对于long和float?long占八个字节,float只占四个。。。。好奇心之下我输出了long和float表示的最大数,结果是这样的….

float类型能表示的数的最大值远远大于long?why?
这里就涉及到浮点数在内存中的存储问题了。对于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.125*10^2,所以呢,对于一个二进制数,我们的表示就应该是1.XXX* 2^X,由于第一位永远都是1所以直接省去,因此表示为S.M*2^E。所以float的取值范围是-2^128到2^128,远远大于long的最大值。
所以java中long类型自动转换为float类型。

标签:0000,字节,float,long,Java,byte,1000
来源: https://www.cnblogs.com/li77/p/15100955.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有