数据类型转换
1. 什么时候会发生类型转换:
a.等号左右两边类型不一致时
b.不同类型的数据做运算
2.分类:
a.自动类型转化
将取值范围小的数据类型赋值给取值范围大的数据类型->小自动转大
取值范围小的数据类型和取值范围大的数据做运算->小自动转大
b.强制类型转换
当取值范围大的数据类型赋值给取值范围小的数据类型->需要强转
3.基本数据类型中按照取值范围从小到大排序:
byte,short,char->int->long->float->double
1.自动类型转换
1.将取值范围小的数据类型赋值给取值范围大的数据类型->小自动转大
2.取值范围小的数据类型和取值范围大的数据做运算->小自动转大
public class Demo09DataType{
public static void main(string[] args){
/*
等号右边是整数,整数默认类型是int
等号左边是long型的变量
将取值范围小的数据类型赋值给取值范围大的数据类型,发生了自动类型转换
*/
long num1 = 100;
System.out.println(num1);
int i = 10;
double b = 2.5;
/*
double = int+double
double = double+double
int自动提升为了double,发生了制动类转换
*/
double sum = i+b
System.out.println(sum);
}
}
2. 强制类型转换
1.将取值范围大的赋值给取值范围小的数据类型
取值范围小的数据类型 变量名 = 取值范围大的数据类型 ->需要强转
2.怎么强转:
取值范围小的数据类型 变量名 = (取值范围小的数据类型)取值范围大的数据类型
public class Demo10DataType{
public static void main(string[] args){
/*
等号右数据类型是小数,小数边默认的类型为double
*/
float num1 = 2.5;
float num = (float)2.5;//有点多余直接float num = 2.5F;就OK
System.out.println(num1);
}
}
3.强制类型转换注意事项
1.不要随意写成强制转换格式,因为会有精度损失问题以及数据溢出现象,除非没有办法
2.byte,short定义时如果等号右边是常量,如果不超出byte和short的范围,不需要我们自己转,jvm自动转换。
byte,short如果等号右边有变量参与,byte和short自动提升为int,然后再次赋值给byte,short的变量需要我们自己手动转
3.char类型如果参与运算,会自动提升为int型,如果char类型的字符提升为int型会区ASCII码表中去查询字符对应的int值,如果ASCII没有就回去Unicode(万国表)码表中去找。
public class Demo10DataType{
public static void main(string[] args){
//精度损失
int i = (int)2.1;
System.out.println(i);
/*
数据溢出
int 型占内存4个字节,4个字节变成二进制是32位
100个亿:10 0101 0100 1011 1110 0100 0000 0000 34位二进制
100个亿的二进制比int型的二进制多出来2位,此时干掉前面两位
0101 0100 1011 1110 0100 0000 0000 = 1410065408
*/
int j = (int)10000000000L;
System.out.println(j);//1410065408
System.out.println("======================")
byte b = 10;
System.out.println(b);
b = b+1;
System.out.println(b);
char c = 'a';
System.out.println(c+0);
}
}