彻底理解Java中的基本数据类型转换(自动、强制、提升)
发布日期:2021-06-30 13:05:17 浏览次数:2 分类:技术文章

本文共 1052 字,大约阅读时间需要 3 分钟。

image

说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示。

image

重新温故了下原始数据类型,现在来解释下它们之间的转换关系。

自动类型转换

自动类型转换是指:数字表示范围小的数据类型可以自动转换成范围大的数据类型。

如:

long l = 100;int i = 200;long ll = i;

具体自动转换如如下图所示。

image

实线表示自动转换时不会造成数据丢失,虚线则可能会出现数据丢失问题。

自动转换也要小心数据溢出问题,看下面的例子。

int count = 100000000;int price = 1999;long totalPrice = count * price;

编译没任何问题,但结果却输出的是负数,这是因为两个 int 相乘得到的结果是 int, 相乘的结果超出了 int 的代表范围。这种情况,一般把第一个数据转换成范围大的数据类型再和其他的数据进行运算。

int count = 100000000;int price = 1999;long totalPrice = (long) count * price;

另外,向下转换时可以直接将 int 常量字面量赋值给 byte、short、char 等数据类型,而不需要强制转换,只要该常量值不超过该类型的表示范围都能自动转换。

强制类型转换

强制类型转换我们再清楚不过了,即强制显示的把一个数据类型转换为另外一种数据类型。

如:

short s = 199;int i = s;// 199double d = 10.24;long ll = (long) d;// 10

以上的转换结果都在我们的预期之内,属于正常的转换和丢失精度的情况,下面的例子就一样属于数据溢出的情况。

int ii = 300;byte b = (byte)ii;

300 已经超出了 byte 类型表示的范围,所以会转换成一个毫无意义的数字。

类型提升

所谓类型提升就是指在多种不同数据类型的表达式中,类型会自动向范围表示大的值的数据类型提升。

把上面的溢出的例子再改下。

long count = 100000000;int price = 1999;long totalPrice = price * count;

price 为 int 型,count 为 long 型,运算结果为 long 型,运算结果正常,没有出现溢出的情况。

推荐:

扫描关注我们的微信公众号,干货每天更新。

image

转载地址:https://javastack.blog.csdn.net/article/details/80512252 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:5月份值得一看的 Java 技术干货!
下一篇:Java序列化技术即将被废除!!!

发表评论

最新留言

不错!
[***.144.177.141]2024年04月11日 12时02分17秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【大数据开发】Java基础-总结1-可变参数的注意点 2019-05-01
【Java习题】 -- 设计⼀个⽅法,将⼀个数组中的元素倒序排列(注意,不是降序) 2019-05-01
【Java习题】(难)设计⼀个⽅法,找出⼀个整型数组中的第⼆⼤的值 2019-05-01
【Java习题】-- 已知⽅法 public static int[] combine(int[] arr1, int[] arr2) 的作⽤是,合并 两个数组,并对合并后的数组进⾏升序排序 2019-05-01
【Java习题】(难)已知⽅法 public static int[] delete(int[] arr, int ele) 的作⽤是删除数组中第 ⼀次出现的ele元素,并返回删除后的数组 2019-05-01
【大数据开发】Java基础-总结2-面向对象与面向过程的区别 2019-05-01
【大数据开发】Java基础-总结3-面向对象的特点和注意点 2019-05-01
MySQL5.7版本修改了my.ini配置文件后mysql服务无法启动问题 2019-05-01
【大数据开发】Java基础 -总结21-Hashmap和HashTable的区别 2019-05-01
MySQL中关于decimal与double字段类型的区别 2019-05-01
Exception in thread “main“ java.sql.SQLException错误之一: Column Index out of range, 0 < 1. 2019-05-01
C3p0连接池连接mysql出现: com.mchange.v2.resourcepool.BasicResourcePool 2019-05-01
webview加载网页或富文本oom 2019-05-01
机器学习-评价分类、回归算法模型指标 2019-05-01
Azkaban体系结构 2019-05-01
Azkaban2.5环境搭建及测试 2019-05-01
Synchronized与ReentrantLock区别 2019-05-01
机器学习之重头戏-特征预处理 2019-05-01
synchronized底层实现及锁的升级、降级 2019-05-01
Java线程生命周期之旅 2019-05-01