Java学习笔记2

数据类型的转换

自动类型转换

数据类型的自动转换一般是指:容量小的数据类型可以自动转换为容量大的数据类型。如图:
Java学习笔记2_第1张图片
虚线代表可以直接转换但可能会丢失一定的精度,如long类型转换为double类型时会丢失一定精度。

特例:可以将整型常量直接赋值给byte、short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。

强制类型转换

强制类型转换,又被称为造型,用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。

当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。

int x = 300;
byte bx = (byte)x;    //值为44

byte的标识范围(-128~127)超出的部分从范围的最左边开始算起直到第44位为300

注意:不能在布尔类型和任何数值类型之间做强制类型转换

数据溢出问题

一些基本数据类型的范围:
long的数据范围:-9223372036854775808—9223372036854775807;
int的数据范围:-2147483648—2147483647;
short:-32768—32767;
byte:-128—127;
char:0—65536;
float:-3.4E38—3.4E38
double:-1.7E38—1.7E38;

数据溢出就是指当某一种类型的数值已经达到了此类型能够保存的最大值之后,再继续扩大,或者达到了最小值后再继续缩小,就会出现数据溢出问题。
如:

int money = 1000000000;  //10亿
int years = 20;
int total = money*years;
System.out.println("total="+total);
//返回的total是负数,超过了int的范围
long total1 = money*years; 
System.out.println("total1="+total1);
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long,但是已经发生了数据丢失
total = -1474836480
total1 = -1474836480

解决方法:先将一个因子变成long类型使整个表达式的数据类型全变为long来计算,如:

long total2 = money*((long)years); 
System.out.println("total2="+total2);
total2 = 20000000000

你可能感兴趣的:(java)