1.自动类型转换
满足以下两个条件:
(1)两种数据类型彼此兼容
(2)目标类型的取值范围大于源类型的取值范围
自动转换大致可分为3种情况:
(1)整数类型之间的转换
(2)整数类型转换为float类型
(3)其他类型转换为double类型
public static void main(String[] args) {
/* 整数之间的转换 (可以简单粗暴的看为大吃小 小转大) */
byte b = 32;
long l = b;
/* 整数转单精度浮点数 */
float f = l;/* 这里要注意long是8字节,float是4字节,有数据丢失的风险 所以不建议long转float */
/* 其他类型转双精度浮点数 */
char c = 97;
double d = c;
System.out.println(l+" "+f+" "+d);
}
2.强制类型转换
(1)强制类型转换的方法为:
目标类型 变量 = (目标类型) 变量或值
public static void main(String[] args) {
int num = 7;
byte num2 ;
num2 = (byte)num; //注意,强制类型转换一样容易造成数据丢失
System.out.println("num = "+num+" num2 = "+num2);
}
(2)强制类型转换数据的丢失
以上为例:
int型占用内存4字节 num=7 在计算机里表示为 00000000 00000000 00000000 00000111
byte型占用内存1字节 故在强制类型转换中 num 会丢失3个高位字节的数据
故 num2 只能取到 num 最低位字节的数据 00000111
温馨提示:
变量在表达式中运行时,有可能会自动提升数据类型。
比如以下代码段:
public static void main(String[] args) {
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2;
System.out.println(b3);
}
明明 b1,b2 都是 byte 类型,可编译器却说是 int 型
也就是说在运算期间 b1,b2 被自动提升为 int 型。 注意是 b1,b2被提升类型,而不是 b1+b2 的结果被提升类型
解决方法很简单,就是用上 强制类型转换 的方法,如下:
public static void main(String[] args) {
byte b1 = 1;
byte b2 = 2;
byte b3 = (byte) (b1 + b2);
System.out.println("b3="+b3);
}