彻底理解Java中的基本数据类型转换(自动、强制、提升)

10月30日 收藏 1 评论 7 java开发

彻底理解Java中的基本数据类型转换(自动、强制、提升)

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

基本类型分别分为三类:

整形:      short (1字节) byte(2字节)      int (4字节) long(8字节)

浮点型:  floot(4字节)   double(8字节)

字符型:  char(2字节)   boolean(1字节)

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

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

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

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

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

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

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;// 199

double 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 型,运算结果正常,没有出现溢出的情况。


转自:https://www.cnblogs.com/javastack/p/9111750.html

C 7条回复 评论
轻舟行

有没有蜕变测试或者ai测试的教程

发表于 2024-09-05 22:00:00
0 0
半个八度

学到了,原来是这样

发表于 2023-01-10 23:00:00
0 0
我是一只粽子啊

进我收藏夹吃灰去吧

发表于 2022-05-28 23:00:00
0 0
墨色槐

没看这篇帖子之前完全不懂该咋答

发表于 2021-12-06 19:40:00
0 0
大大大

非常详细, 非常清晰, 代码测试可用。 教科书级别

发表于 2021-09-13 10:15:00
0 0
紫侠仙子

我想学习黑客,但是我没有文化

发表于 2021-09-12 10:50:00
0 0
Amusi

安利一款我用过最好用的接口测试工具——apipost ,页面简洁,操作简单功能也多。

发表于 2021-09-10 21:40:00
0 0
山山而川明明如月

又搞定一个知识盲区

发表于 2021-09-10 15:05:00
0 0
二大爷

整形的越界会怎么提示

发表于 2019-11-03 11:07:41
0 0
二大爷

hbbbbbbbbbbbbbbbbbbbbb
hhhhhnnn
nnnnnnhhhbbbbb
bbhhgh( ˃̶̤́ ꒳ ˂̶̤̀ )

发表于 2019-10-31 06:49:32
0 0