类型转换
低----------------------------------------------------------------->高
byte、short、char------> int —>long —>float —>double
运算中,不同类型的数据先转换为同一类型,然后进行运算。
- 强制类型转换
- 自动类型转换
【小数的优先级一定大于整数】
强制转换 【格式】(类型)变量名 高 ----> 低
自动转换 无需格式 低 ----> 高
强制转换
【格式】: ( 类型 ) + 变量名;
package DAY01;
public class demo05 {
public static void main(String[] args) {
int i = 128;
byte b = (byte) i;
//强制转换【格式】: ( 类型 ) + 变量名;
System.out.println(i);//输出【128】
System.out.println(b);//输出【-128】
}
}
为什么 b 的输出为 -128 呢?
答:因为Byte类型的数据最大值为127,故内存溢出了。
情况一:int i=3654;
byte ba = 127;
int i=3654;
byte bb = (byte)i;
System.out.println(ba);
System.out.println(i);
System.out.println(bb); // 70
System.out.println(i%128-128*((i/128)%2)); // 70
System.out.println(128*((i/128)%2)); // 0
System.out.println(i/128); // 28
System.out.println(i%128); // 70
情况二:int i=3754;
byte ba = 127;
int i=3754;
byte bb = (byte)i;
System.out.println(ba);
System.out.println(i);
System.out.println(bb); // -86
System.out.println(i%128-128*((i/128)%2)); // -86
System.out.println(128*((i/128)%2)); // 128*1
System.out.println(i/128); // 29
System.out.println(i%128); // 42
如何查Byte类型数据的Max和Min值
- 输入一个Byte
Byte // 【Ctrl+鼠标左键单击】
然后就可以出现下图。
代码
public class demo04 {
public static void main(String[] args) {
int i =128;
byte b = (byte) i ; //内存溢出
//强制转换 (类型)变量名
System.out.println(i);
System.out.println(b);
System.out.println("========================");
//强制转换 【格式】(类型)变量名 高 ----> 低
//自动转换 无需格式 低 ----> 高
//【低-->高】byte、short、char----> int--->long --->float -->double
int j =128;
double c = j ;
System.out.println(j);//输出为【128】
System.out.println(c);//输出为【128.0】
/*
【注意】:
1.不能对布尔值进行转换【判断对错】
2.不能把对象类型转换为不相干的类型
3.在把高容量转换到低容量的时候,强制转换
4.转换的时候可能存在内存溢出,或者精度问题!
*/
System.out.println("===========");
System.out.println((int) 23.7); // 输出23
System.out.println((int)-45.974f); //输出-45
//向0取整 ,精度丢失了
System.out.println("=============");
char e = 'a';
int d = e + 1; //【自动转换为Int类型:低--->高】
System.out.println(d); //输出为98
System.out.println((char)d); //输出b 【强制转换】
}
}
操作比较大的数的时候,注意溢出问题
public class demo05 {
public static void main(String[] args) {
//操作比较大的数的时候,注意溢出问题
//数字之间可以用下划线分割,输出时,下划线不会被输出
int money = 10_0000_0000;
int years = 20;
int total = money*years; //说明计算的时候溢出了
System.out.println(total); //输出为【-1474836480】 理论上为200亿
//Integer最大为 0x7fffffff = 2^31-1=21_4748_3647 21亿多
}
}
如果是money = 1_0000_0000,就不会溢出。
public class demo05 {
public static void main(String[] args) {
//操作比较大的数的时候,注意溢出问题
//数字之间可以用下划线分割,输出时,下划线不会被输出
int money = 10_0000_0000;
int years = 20;
int total = money*years; //说明计算的时候溢出了 【-1474836480】
long total2 = money*years;
//先计算,默认是int,转换之前就已经存在问题了,出问题后,在进行类型转换
//Long是非常大的数据类型
System.out.println(total2); //【-1474836480】这样编码依旧是有问题的
}
}
正确的代码
public class demo05 {
public static void main(String[] args) {
//操作比较大的数的时候,注意溢出问题
//数字之间可以用下划线分割,输出时,下划线不会被输出
int money = 10_0000_0000;
int years = 20;
int total = money*years; //说明计算的时候溢出了 【-1474836480】
long total2 = money*years;
//先计算,默认是int,转换之前就已经存在问题了,出问题后,在进行类型转换
//Long是非常大的数据类型
long total3 = (long)money*years; //先把一个数转换成Long
System.out.println(total3); //【200亿】对的
}
}
//第11行也可以换成long total3 = (long)money*(long)years;
//或者long total3 = money*(long)years;
//或者更规范点 long total3 = money*((long)years);