Day08——强制转换
类型转换
由于 Java 是强类型语言,所以要进行有些运算的时候,需要用到类型转换。
类型的优先级
低----------------------------------------------------------->高
byte,short,char->int->long->float->double
运算中,不同类型的数据先转化为同一类型,然后进行运算。
//内存溢出
int i1= 128;
byte i2=(byte)i1; //内存溢出——byte类型取值范围是 -128 到 127,超出范围
//强制转换 (类型)变量名!!!!! 高--->低
//自动转换 低--->高
System.out.println(i1); //i1=128
System.out.println(i2); //i2=-128
System.out.println("====================================");
int i3=10;
double i4=i3;
System.out.println(i3);
System.out.println(i4);
System.out.println("====================================");
//转换时,浮点数的精度问题
System.out.println((int)23.7); //23
System.out.println((int)-45.89f); //-45
/*
类型转换的注意事项
1.不能对布尔值转换
2.不能把数据类型转换为不相干的类型
3.优先级高转换为低的时候,强制转换
4.在转换过程中,可能存在精度问题或者数据溢出问题
*/
System.out.println("====================================");
char i5='a';
int i6=i5+1;
System.out.println((int)i5); //97
System.out.println(i6); //98
System.out.println((char) i6); //b
类型转换的注意事项
1.不能对布尔值转换
2.不能把数据类型转换为不相干的类型
3.优先级高转换为低的时候,强制转换
4.在转换过程中,可能存在精度问题或者数据溢出问题
强制类型转换
自动类型转换。
较大的数字计算
//在打出较大数字时,可以用下划线分隔开,下划线不会输出
int i1=10_0000_0000; //十亿 每四位数有一个下划线分隔开
System.out.println(i1);
System.out.println("========================================");
//计算问题:每年赚10亿,20年一共赚多少?
int money=10_0000_0000;
int years=20;
int total=money*years;
System.out.println(total);//-1474836480
long total2=money*years; //转换为范围更大的long。
// 但money*years计算结果已经默认是int类型了,然后再转换为long类型,就有问题了
System.out.println(total2);//-1474836480
long total3=money*(long)years;
System.out.println(total3); //200_0000_0000---------正确计算,先把一个数转换为long类型
//在 Java 中,当一个 `long` 类型与一个 `int` 类型相乘时,结果为 `long` 类型。
//这是因为在 Java 的运算中,如果参与运算的数据类型不同,会自动进行类型提升,以确保计算的准确性和避免数据丢失。
// 由于 `long` 类型的取值范围大于 `int` 类型,所以计算结果会被提升为 `long` 类型。
注意点:
-
在打出较大数字时,可以用下划线分隔开,下划线不会输出。每四位数有一个下划线分隔开。如:10_0000_0000
-
long类型与int类型相乘,结果是long类型。
因为在 Java 的运算中,如果参与运算的数据类型不同,会自动进行类型提升,以确保计算的准确性和避免数据丢失。由于
long
类型的取值范围大于int
类型,所以计算结果会被提升为long
类型表述范围小的可以自动转换为表述范围大的
在 Java 中,不同类型的数字进行加减乘除运算时,结果的类型遵循以下规则: **一、加法(+)** 1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。 - 例如:`int a = 10; long b = 20; long result = a + b;`,结果 `result` 是 `long` 类型。 2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。 - 例如:`int a = 10; double b = 20.5; double result = a + b;`,结果 `result` 是 `double` 类型。 3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。 - 例如:`short a = 10; short b = 20; int result = a + b;`,结果 `result` 是 `int` 类型。 **二、减法(-)** 与加法类似: 1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。 2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。 3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。 **三、乘法(*)** 1. 如果两个操作数中有一个是 `long` 类型,那么结果为 `long` 类型。 2. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。 3. 否则,如果两个操作数都是 `int`、`short`、`byte`、`char` 类型,结果为 `int` 类型。 **四、除法(/)** 1. 如果两个操作数中有一个是 `double` 类型,那么结果为 `double` 类型。 - 例如:`int a = 10; double b = 20.5; double result = a / b;`,结果 `result` 是 `double` 类型。 2. 如果两个操作数都是 `int`、`long`、`short`、`byte`、`char` 类型: - 对于整数除法,结果为整数类型,即如果两个操作数都是 `int`,结果为 `int`;如果两个操作数中有一个是 `long`,结果为 `long`。 - 例如:`int a = 10; int b = 3; int result = a / b;`,结果 `result` 是 `int` 类型,值为 3。`long c = 10L; long d = 3L; long result2 = c / d;`,结果 `result2` 是 `long` 类型。 需要注意的是,整数除法可能会导致精度丢失,因为它会截断小数部分。如果需要精确的除法结果,可以将操作数之一转换为 `double` 类型进行计算。 表述范围小的可以自动转换为表述范围大的
自我测评
1.将int类型的128转换为byte类型
2.将char类型的‘a’转换为int类型
3.计算10亿乘20的准确结果