数据类型转换
1.什么时候发生类型转换
a.等号两边不一致的时候
b.不同类型的数据做运算
2.分类:
a.自动类型转换
将取值小的数据类赋值给取值大的数据类型 -> 小自动转大
取值小的数据类型和取值大的数据类型数据做运算 -> 小自动转大
b.强制类型转换
当取值范围大的数据类型赋值给取值范围小的数据类型 -> 需要强制
3.基本类型中按照取值范围从小到大排序:
byte,short,char -> int -> long -> float -> double
1.自动类型转换
1.将取值范围小的数据类型赋值给取值范围大数据类型 -> 小自动转大
2.取值范围小的数据类型和取值范围大的数据类型做运算 -> 小自动转大
public class Main {
public static void main(String[] args){
/*
等号右边是整数,整数默认类型为int
等号左边是long型的变量
将取值范围小的数据类型赋值给取值范围大的数据类型,发生了自动类型转换
*/
long num1 = 100;
System.out.println(num1);//结果输出为:100
int i = 10;
double j = 2.5;
/*
double = int + double
double = double + double
int自动提升为了double,发生了自动类型转换
*/
double sum1 = i + j;
System.out.println(sum1);// 结果输出为12.5
}
2.强制类型转换
1.将取值范围大的数据类型赋值给取值范围小的数据类型
取值范围小的数据类型 变量名 = 取值范围大的数据类型 -> 需要强转
2.怎么转
取值范围小的数据类型 变量名 = (取值范围小的数据类型)取值范围大的数据类型
public class qzzh {
public static void main(String[] args){
/*
等号右边是小数,小数默认类型是double
等号左边的变量是float型 double > float
将取值范围大的赋值给取值范围小的 -> 报错,需要强转
*/
//float num1 = 2.5; 会报错
//float num1 = (float)2.5; //正确方法1
float num1 = 2.5F; //正确方法2
System.out.println(num1);
其他类型同样:
long num2 = 10L;
System.out.println(num2);
}
}
3.强转的注意事项
1.不要随意写成强转的格式,因为会有精度损失问题以及数据溢出现象,除非没办法.
2.byte,short定义的时候如果等号右边是整数常量,如果不超出byte和short的范围,不需要我们强转,jvm会自动转型.
byte short 如果右边等号右边有变量参与,byte和short自动提升为int.再次赋值就需要手动转型.
3.char 类型数据参与运算,会自动提升位int型,如果char类型的字符提升为int型会去ASCII码表范围内去查询字母相应的整数.
public class jdss {
public static void main(String[] args){
//精度损失
int i = (int)2.5;
System.out.println(i);//输出结果为2
/*
数据溢出
int型内存占据4个字节,4个字节变成二进制就是32
*/
2. int j = (int)100000000000L;
System.out.println(j);
byte b = 10;
b = (byte)(b + 1);
System.out.println(b); //输出11
3. char c = 'a';
System.out.println(c+0); //输出97
}
}
//byte赋值超范围
public class cfwei {
public static void main(String[] args){
byte b = (byte) 200;
System.out.println(b);//输出 -56
/*
200
源码:11001000
反码:10110111
补码:10111000 -56
*/
byte b1 = (byte) 128;
System.out.println(b1); //byte取值范围 -128到127,128超了一位,
// 就从-128开始第一个数开始数,第一个数是-128,所以输出-128.
}
}