一、基本数据类型转换
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 } }