java中float和double的存储形式

float

java中float的表示范围为1.4E-45 ~ 3.4028235E38,浮点数的取值计算公式为s*m*2^{(e-127)}

float的存储占4字节,分为三个部分,分别为符号位,底数以及指数部分。

符号位:占1位,表示数值的正负。

指数部分:占8位,8位的空间可以表示0~255,但是指数有正有负,为了可以完全地表示正负,指数部分需要减去127才能表示真正的指数部分。因此指数可以表示-126~128(尾数占用23位,,但是根据指数部分的取值可以有24位,所以引入一个附加位,当所有的指数部分都是0的时候,附加位为0,否则附加位为1,这个可能就是为什么指数只能表示-126~128的原因)。

底数部分:占23位,可以表示2^{23}。但是按照底数的表达方式,进行小数点移位的时候,最左边移位必然是1,因此这里的1可以省去,因此可以多表示1位,因此这里可以表示2^{23}。底数是没有正负的。

 

以-5为例进行解释:-5转化为二进制表示为1101,在进行浮点数表示的时候,符号位为1,剩下的数值部分为0101,将小数点左移得到1.010,由于底数表示的时候除0外最左边一位必定为1,因此在进行存储的时候将最左边一位移除,因此底数位为0100,由于底数向左移动两位,因此指数为0100,而指数需要加上127因此指数部分为10000011,因此-5在计算机中的表示为1 10000011 0100 0000 0000 0000 0000 000

再以20.3为例进行解释:20的二进制表示为10100(二进制),0.3的二进制表示为

0.3 * 2 = 0.6(0)

0.6 * 2 = 1.2(1)

0.2 * 2 = 0.4(0)

0.4 * 2 = 0.8(0)

0.8 * 2 = 1.6(1)

0.6 * 2 = 1.2(1)

后面即进行0011的循环,因此0.3的二进制表示为0100110011001(循环)。

20.3的二进制表示为10100.0100110011001(循环),进行浮点数表示时,将小数点向左移位4位,变为1.0100010011001100(循环),将第一位去掉变为.0100010011001100(循环)。由于底数只有23位,因此这里表示为0100 0100 1100 1100 1100 110。指数表示为10000011,因此20.3的浮点数存储表示为0 10000011 0100 0100 1100 1100 1100 110。

double

double的浮点数计算公式为s*m*2^{e-1023}

float的存储占8字节,分为三个部分,分别为符号位,底数以及指数部分。

符号位:占一位,表示数值的正负。

指数部分,占11位,11位可以表示0~2047,但是指数可正可负,为了可以完全地表示正负,指数部分需要减去1023才能表示真正的指数部分,因此指数可以表示-1022~1024(尾数占用52位,,但是根据指数部分的取值可以有53位,所以引入一个附加位,当所有的指数部分都是0的时候,附加位为0,否则附加位为1,这个可能就是为什么指数只能表示-1022~1024的原因)。

底数部分:占52位,可以表示2^{52}。但是按照底数的表达方式,进行小数点移位的时候,最左边移位必然是1,因此这里的1可以省去,因此可以多表示1位,因此这里可以表示2^{52}。底数是没有正负的。

 

这里就不再举例,和float类似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值