一、基本数据类型转换
8种基本数据类型除了boolean类型外,都可相互转换。
1.自动类型转换
- 变量在做运算的时候,可能产生溢出的情况,那么此时java语言将采用自动类型转换的方式来处理。
-
小空间的数据类型和大空间的数据类型的数运算时,会向大空间的数据类型转换。
byte–>short–>int–>long–>float–>double
(1) byte、short、char类型在做计算的时候会自动的把数据类型提升为 int 型
class Demo1{
public static void main(String[] args){
//byte在做运算的时候会自动的提升成int型
byte a = 16;
//错误:byte b = a + 1;
int b = a + 1;
System.out.println(b);
//char类型的数据在参与运算的时候,每一个char背后都对应一个数值类型ASCII码,参与计算的是ASCII码
char c = 'a'; //这里的字符a对应的十进制数为97
int d = c + 1;
System.out.println(d);
}
}(2) int 类型和其他的数值计算时,也会溢出,但int不会提升 而是直接损失精度
class Demo1{
public static void main(String[] args){
//int一旦达到最大值就会损失精度
int e = 2147483647; //2147483647 为int的最大值
//int不能提升成long
long f = e + 1;
System.out.println(f); //f = -2147483648
}
}
- int 为4个字节,所以int 的最大值为:
- 0111 1111 1111 1111 1111 1111 1111 1111
- + 1
-
1000 0000 0000 0000 0000 0000 0000 0000
(3) 任何的整数类型和 long 类型做运算都会转换成 long 类型
class Demo1{
public static void main(String[] args){
long l1 = 200;
byte a = 10;
long l2 = l1 + a;
System.out.println(l2); // l2 = 210
}
}(4) 常量在做运算的时候,只要不超出定义的数据类型的范围就不会报错,不会发生数据类型的自动提升
class Demo1{
public static void main(String[] args){
//这是不报错的情况
byte b1 = 3 + 20;
System.out.println(b1); // b1 = 23
//这是报错的情况
byte b2 = 127 + 1; // 会造成溢出
System.out.println(b2);
}
}(5) float 类型(或double类型)和常量计算,会自动转换成 float 类型(或double类型)
class Demo1{
public static void main(String[] args){
float f1 = 15.3f;
float f2 = f1 + 1;
System.out.println(f2); // f2 = 16.3
}
}(6) float 类型和 float 类型计算,不会有数据类型的提升
class Demo1{
public static void main(String[] args){
float f1 = 15.3f;
float f2 = 10.0f;
float f3 = f1 + f2;
System.out.println(f3); // f3 = 25.3
}
}(7) float 类型(或者double类型)和任何整数类型计算,都会转换成 float类型(或者double类型)
class Demo1{
public static void main(String[] args){
byte b = 100;
short s = 20;
int i = 40;
long l = 100;
float f = 13.2f;
float f1 = f + b;
System.out.println(f1); // f1 = 113.2
float f2 = f + s;
System.out.println(f2); // f2 = 33.2
float f3 = f + i;
System.out.println(f3); // f3= 53.2
float f4 = f + l;
System.out.println(f4); // f4 = 113.2
}
}(8) double 类型和 float 类型计算,会自动转换成 double 类型
2.强制类型转换
- 大空间的数据类型向小空间的数据类型去转换。
-
语法:<目标数据类型>变量名
(1) int型转换为byte型
// 数值8是既在int范围里,也在byte范围里,所以转换之后不会有啥问题
class Demo1{
public static void main(String[] args){
// 把int型强制转换成byte型
int i = 8;
byte b = (byte)i;
System.out.println(b); // b= 8
}
}
- 转换原理:
- int 类型的8: 00000000 00000000 00000000 00001000
- short 类型的8: 00000000 00001000
- byte 类型的8: 00001000
- 通过观察截取之后的二进制数 0000 1000 最高位符号位是0,所以这是一个正数,而计算机中所有的数据都是以补码的形式出现的,所以要计算它的补码;
- 正数:原码 = 反码 = 补码
-
最终看到的结果还是:0000 1000(最高位符号位不运算,数值位转化为十进制的8,因0为正,所以为+8)
// 数值130是只在int范围里,不在byte范围里,所以这里强制转换之后会损失精度
class Demo1{
public static void main(String[] args){
// 把int型强制转换成byte型
int i = 130;
byte b = (byte)i;
System.out.println(b); // b = -126
}
} - 转换原理:
- 数据130是int类型的十进制数据;
- 第一步:十进制的130转换成二进制数据 1000 0010;
- 第二步:占4个字节的int型,做截取的过程如下:
- int 类型的130: 00000000 00000000 00000000 10000010
- byte 类型的130: 10000010
-
通过观察最高位符号是1,所以这是一个负数,而计算机中所有的数据都是以补码的形式出现的,所以要算它的补码;
原码:1000 0010(原码变反码:最高位符号位不变,其他数值位0变1,1变0)
反码:1111 1101(反码变补码:反码加1即可得)
补码:1111 1110 -
最终看到的结果就是:1111 1110(最高位是符号位不运算,数值位转化为十进制得126,因1为负,所以为-126)
(2) float型转换为int、byte、short、long型,都是一样的(下面以int为例)
class Demo1{
public static void main(String[] args){
// 小数强制转换为整数后,会舍弃小数位
float f = 12.5f;
int i1 = (int)f;
System.out.println(i1); // i1 = 12
}
}(3) double 类型转化成 float类型
class Demo1{
public static void main(String[] args){
// double数据类型转换成float类型
double d = 20.3;
float f = (float)d;
System.out.println(f); // f = 20.3
}
}