为了账号安全,请及时绑定邮箱和手机立即绑定

java之二进制与数据类型

标签:
Java

一、各数据类型的最大值和最小值

整数:

以byte为例,我们知道,byte共有8个bit位,最大值是0111111,最小值是10000000,用十进制来表示就是-128~127,即-2^7~2^7。

依照上面的推理方式可知

总结下表:

数据类型
bit位取值范围
byte8-2^7~2^7-1
short16-2^15~2^15-1
int32-2^32~2^32-1
long64-2^63~2^63-1

小数:

我们知道float是32位,double为64位,分别被叫做单精度和双精度小数。但是他们的最大值却不是通过上面的代码来确定的,我们用代码来看看它们的最大值是多少:

System.out.println("float的最大值:"+Float.MAX_VALUE);System.out.println("double的最大值:"+Double.MAX_VALUE);

运行结果:

float的最大值:3.4028235E38double的最大值:1.7976931348623157E308

通过上面的代码,我们知道了float的最大值为3.4*10^38,double的最大值为1.79*10^308。

那为什么同样是32位的int和64位的long无法表示呢?

我们来看看存储结构:

由于二进制比较麻烦,我们用十进制来表示。

整数的存储很简单,第一位为符号位,其他剩余位都表示数值,例如

0999

第一位为符号位,后面的三位则均为数字位,所以,这表示的就是999。

但是小数的存储方法就不相同:

符号位指数位(阶码位)尾数位(小数位)

以double第一位和整数一样是符号位,之后的指数位共有11位,剩下的位数全部是尾数位,以double为例,double的尾数位就是52位。

还是刚才的数值:


0999

第一位0位符号位,第一个“9”表示指数位,后面的两个9就表示小数即0.99,那么这个数字就是0.99*10^9。


这就是为什么同样位数的小数要比整数表示的数字要大。

二、精确度

我们首先用int 和float表示相同的一个数字:

int a = 12345678;float b = 12345678;System.out.println("int:"+a);System.out.println("float:"+b);

运行结果:

int:12345678float:1.2345678E7

此时,int和float的值结果是相同的,当他们表示一个更大的数时就会出现如下问题:

int a = 123456789;float b = 123456789;System.out.println("int:"+a);System.out.println("float:"+b);

运行结果:

int:123456789float:1.23456792E8

此时,float丢失了一个数字8,现在我们再用double来表示这个数字:

double c = 123456789;System.out.println("double:"+c);

运行结果:

double:1.23456789E8

我们惊奇的发现:double没有丢失数据!

正如我们上面说的,float是32位,double为64位,float之所以出现丢失数据的显现,是因为float的位数不足以存储123456789,所以部分数据就丢失了,但是double有64位,小数位足以表示123456789,因此就不会发生数据丢失。

三、强制数据类型转换

高精度->低精度

从高精度转为低精度时会发生精度丢失的状况,例如:

double a = 123.45;int b = (int) a;System.out.println(b);

运行结果:

123

可见,由double转为int时,会将小数部分丢掉。

高位->低位

位数多的转为位数少的会发生高位数据丢失,例如:

int a = 129;byte b = (byte) a;System.out.println(b);

运行结果:

-127

我们知道,int为32位,129用二进制表示就是00000000 00000000 00000000 10000001。在强转为byte时,由于byte只有8位,会将前24位全部舍掉,剩下的就是10000001,转为十进制就是-127。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消