黑马程序员,看Java基础视频笔记:基础类型的大小范围和类型转换

今天看了毕老师的类型转换,明白了以前的问题:为什么让byte型数据+1会自动变成int型了。

自动类型转换,也称自动类型提升,或隐式类型转换,是java编译系统在进行两个不同类型数据运算时,让它们先转换成同一类型,再进行运算,它遵循的规则是:1.当低字节的数据类型与高字节的数据类型在进行运算时,为了确保精度不变,优先将低字节的数据类型转换成高字节的数据类型再进行运算。2.若两种数据一个有符号,一个无符号,会自动转换成无符号类型。

经过在下亲自在elipse下测试得到如下数据:

byte数据占1个字节,可达最大值是127;short型2个字节,最大值32767;char型2个字节,最大值是‘?’(我认为这是因为char型数据本身存放着字符,而排放在最末尾的是‘?’)接着说,int型4个字节,最大值2147483647,也就是有21亿多。long型8个字节,最大值9.22E19。而float型是4个字节,最大值3.40E38。double型8个字节,最大值1.79E308。(E后面的数字代表10的N次方。)

所以转换的顺序是:byte,short,char->int->long->float->double,都说低字节的向高字节数据类型转换,为什么8个字节大小的long会向4个字节的float型转换呢?查阅资料综合个人思考的回答是,float型是精确到小数点后n位数值的,当long型+float型运算时,会在得到的结果上取7位有效数字(包括小数点后的数值)存放在4个字节中,转成float型。这7位有效数字是从高往低取的,余下部分则自动被舍去了。所以如果你定义

long a = 1089212346l;
float b = 1.0f;
b = a;
System.out.println(b);


得到的结果不再是原a的值,而是一个接近a的估计值。如果你这样定义:


float a = 2000000000f;
float b = 2000000050f;
System.out.println(f1==f2);

这个结果会是true,float型的7位有效数字意味着它无法准确的表达每一个数值。(所以尽管float能表示的范围比long更大,但是超过7位有效数字能表示的范围,就变得不精确)

有两点需要注意的:

1、当我们这样定义long a = 3;而不是long a = 3L,则默认表示为int型。这就是为什么long x = 9223372036854775807  (2^63-1)会报错,因为它已经超过int的大小范围了.

2、与1相反的是,当我们在定义float a = 3.0;而不是float a = 3.0F时,则默认表示为double型。别问我为什么Java这样定义数据,我也不懂它的任性- -|||


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值