Java种的基本数据类型转换(自动、强制、提升)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FJJ543/article/details/83308738

Java种的8大基本数据类型,以及它们所占内存大小和范围

image

1、自动类型转换

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

如:

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 等数据类型,而不需要强制转换,只要该常量值不超过该类型的表示范围都能自动转换

char a = 400;

2、强制类型转换

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

如:

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 类型表示的范围,所以会转换成一个毫无意义的数字44。原因如下:

int 300在内存种存储如下:大端法

转为byte时,byte只截取了内存地址高8位,即byte b在内存中存储为:

转为十进制为44.

3、类型提升

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

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

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

猜你喜欢

转载自blog.csdn.net/FJJ543/article/details/83308738