Java中整型及浮点型数据存储范围理解


前言

最近复习Java时发现八大基本数据类型中整型浮点型数据的存储范围特别蹊跷,为什么byte的可以存储-128~127之间的数,-128是哪来的?浮点型数据底层到底是怎么存储的?遂深入研究一下,成此文。

一、整型数据的存储范围理解

Java中整型数据包括byte、short、int、long,他们在底层的占用空间都是固定的,byte占用一个字节,short占用2个,int占用4个,long占用8个。byte可表示-128到127,shaort表示-2^15 到 2^ 15-1,........ 此处以byte举例,我们可以很容易的知道,byte占用一个字节,即8位,其中最高位又为符号位,所以其可以表示的最大数自然就为2^7-1=127。如下图所示,7个数据位全为1且符号位为正即得最大数,最大数加1即为2^7,所以最大数为2^7-1。

在这里插入图片描述

同理,byte理论上能表示的最小数为-2^7-1=-127,如下图所示(此处所列为原码,为了清楚的说明,这里不再引入补码,后续同理)。

在这里插入图片描述

但实际上Java中byte能存储的最小数为-128,这是因为在有符号位的情况下,8位数据既会出现正0,又会出现负0,如下图所示。然而我们只需要一个0,所以Java中留下正0而将负0用于拓展最小范围,对于byte来讲,负0表示-128。其他整型数据类型是一样的。

在这里插入图片描述
在这里插入图片描述

二、浮点型数据的存储理解

java语言中,float类型数字在计算机中用4个字节(32位)来存储。double类型占用8个字节(64位)。 从存储结构和算法上来讲,double和float是一样的,采用的科学记数法表示。例如123.456可以表示成1.23456×10^2。其存储方式如下
在这里插入图片描述

符号位(最高位):表示正、负数。
指数部分:表示以2为底数的幂次数。此处算出的指数必须减去127才是真正的指数。
有效位:表示有效数字。
举例:
17.625在内存中的存储为:
首先要把17.625换算成二进制:10001.101。
整数部分:除以2,直到商为0,余数反转。(即:模2取余法)
17 % 2 = 8 —> 1 低位
8 % 2 = 4 —> 0
4 % 2 = 2 —> 0
2 % 2 = 1 —> 0
1 % 2 = 0 —> 1 高位
小数部分:乘以2,直到乘位为0,进位顺序取。(即:乘2取整法)
按如下算法进行:
1)首先给小数部分乘2,得到的数,如果小数点前为1;则计1,为0,则计0。
2)再对剩下的小数部分乘2,再计出1或0。
3)重复以上步骤,直至达到需要的精度。
      0.625 x 2 = 1.25 —> 1 -1位
      0.25 x 2 = 0.5 —> 0 -2位
      0.5 x 2 = 1.0 —> 1 -3位
      0.0 x 2 = 0.0 —> 0 -4位
以上得到17.625换算成二进制为10001.101。
再将10001.101右移,直到小数点前只剩1位,1.0001101 * 24 ,右移动了四位。
此时,底数和指数就出来了。
底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好。所以,此处的底数为:0001101
指数:实际为4,必须加上127(转出的时候,减去127),所以为131。也就是10000011
符号:因为是正数,所以是0
综上所述,17.625在内存中的存储格式是:01000001 10001101 00000000 00000000


引用:https://www.cnblogs.com/java-script/p/11123897.html
https://blog.csdn.net/geyingzhen/article/details/107334817

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值