A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

long与float的取值范围谁大谁小这个问题一直没有听懂,到底是为什么?

3 个回复

倒序浏览
看的另外一个帖子的回复
float类型数字在计算机中用4个字节存储。遵循IEEE-754格式标准:
一个浮点数有2部分组成:底数m和指数e  
底数部分 使用二进制数来表示此浮点数的实际值
指数部分 占用8bit的二进制数,可表示数值范围为0-255  
但是指数可正可负,所以,IEEE规定,此处算出的次方必须减去127才是真正的指数。 所以,float类型的指数可从-126到128  底数部分实际是占用24bit的一个值,但是最高位始终为1,所以,最高位省去不存储,在存储中占23bit         
科学计数法。  格式: SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM S表示浮点数正负     E指数加上127后的值得二进制数据 M底数  
举例:
17.625在内存中的存储  首先要把17.625换算成二进制:10001.101        
整数部分,除以2,直到商为0,余数反转。         
小数部分,乘以2,直到乘位0,进位顺序取。  
在将10001.101右移,直到小数点前只剩1位:1.0001101 * 2^4 因为右移动了四位。这个时候,我们的底数和指数就出来了 底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为:0001101 指数:实际为4,必须加上127(转出的时候,减去127),所以为131。也就是10000011 符号部分是整数,所以是0 综上所述,17.625在内存中的存储格式是: 01000001 10001101 00000000 00000000      
回复 使用道具 举报
another:
float类型占4个字节,总共32位,第一位为符号位  第二位到第九位为指数位 后面23位为小数点位。那么计算指数位的值就OK了 8位 第一位不是符号位,故其范围在0-255之间。这个值是加了127之后的区间 所以必须要减去127才得到真实的指数值 另外全0和全1作为特殊处理,所以直接表示-126到127.
非规格化表示:
    当指数部分全0而且小数部分不全0时表示的是非规格化的浮点数,因为这里默认没有前导1,而是0.
    取值位0.f * 2^(-126),表示范围位 2^(-149)~~ (1-2^(-23)) * 2^(-126) 这里没有考虑符号.这里为什么是-126而不是-127? 如果是-127的话,那么最大表示为 2^(-127)-2^(-149),很显然2^(-127) ~~2^(-126) 就没法表示了.   
其他特殊表示
    1.当指数部分和小数部分全为0时,表示0值,有+0和-0之分(符号位决定),0x00000000表示正0,0x80000000表示负0.
    2.指数部分全1,小数部分全0时,表示无穷大,有正无穷和负无穷,0x7f800000表示正无穷,0xff800000表示负无穷.
    3.指数部分全1,小数部分不全0时,表示NaN,分为QNaN和SNaN,Java中都是NaN.   结论:
    可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是Float.MIN_VALUE和Float.MAX_VALUE.
回复 使用道具 举报
学到了...........
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马