Java的基本数据类型是如何进⾏⾃动变量提升的——数据类型提升基本数据类型转换
1、基本数据类型转换概念
转换原因
Java是强类型语⾔,数据类型之间不能随意转换,但运算时数据类型不匹配,所以需要转换.
2、数据类型转换分类
⾃动类型提升
强制类型转换
2.1、⾃动类型提升
1. 概念
范围⼩的数据类型可以直接转换为范围⼤的数据类型
2. 数据类型范围⼤⼩排序
3. 要点
1. 数据类型兼容 byte short char int long .... 都属于数字类型都是兼容的
boolean 是参与类型转换
2. ⼩范围的数据类型转换为⼤范围的数据类型
4. 案例
public class Demo3{
public static void main(String[] args) {
// ⾃动类型提升
// 第⼀条线  byte --> short --> int --> long --> float --> double
//byte b = 20;//20 字⾯值默认的类型是 int 但是当赋值给b 此时的20就是 byte 类型
//short s = b;// 20 被提升为short类型
/
/int i = s; // 20 --> int
//long l = i; //20 --> long
//float f = l;//20 --> float
//double d = f;//20 --> double
//System.out.println(f);
//第⼆条线路 char --> int --> long --> float --> double
char c = 'A';// A ---> 编码 ---> ⼆进制的 65
System.out.println(c);// ⼆进制的 65 ---> 解码 ---> A
int i = c;// 65  ---> int
System.out.println(i);
long l = i;
float f = l;
double d = f;
System.out.println(d);
}
}
2.2、强制类型转换
1. 概念
⼤范围数据类型的变量/常量赋值给⼀个⼩范围数据类型的变量,需要进⾏强制转换.
要求: 数据类型之间要兼容
2. 格式
⽬标数据类型变量名 = (⽬标数据类型)原数据类型变量名/原常量值;
3. 注意事项
1. 强制类型转换可能会损失精度,得到错误的数据.
2. ⼩数类型强制转换为整数类型时,直接舍去⼩数部分,只保留整数部分.
4. 案例
public class Demo3{
public static void main(String[] args) {
// 强制类型转换
//int i = 128; // 20 --> int
// 在Java程序的编译时期编译器⽆法获取变量中的具体数值
//  编译器是⼀个⽐较严谨的⼀个⼈ --> 保安
//byte b = (byte)i;// 理论上  i的值在byte的范围之内
/
/System.out.println(b);
//  32        00000000  00000000  00000000  10000000  ---> 1*2^7  = 128
//  8                                        10000000  ---->
double d = 12.1;
int i = (int)d;//  1.向上取整  2 向下取整    3 四舍五⼊
System.out.println(i);
}
}
3、常量优化机制
概述
1. 在编译时,整数常量的计算会直接算出结果,并且会⾃动判断该结果是否在该数据类型取值范围内
2. 在为 byte short char 类型变量赋值的时候, 字⾯值类型默认都为int ,按照道理应该需要强制转换 ,但实际不强制转换也能编译通过,这是
因为强制转换在编译器编译的时候会⾃动的加上。
public class Demo3{
public static void main(String[] args) {
//int i = 120+5;
//byte b = 127+1;//在编译时期会直接算出  127+1 = 128
//int a = 2147483647;
//int b = a + 1;//
//System.out.println(b);
byte b = (byte)10;// 10 类型是int    其实强制转换在编译器编译的时候,会⾃动的加上,从⽽减少了程序员的⼯作量 }
}
4、在表达式中,进⾏的⾃动类型提升
表达式: 由变量常量运算符组成的式⼦叫做表达式的值
特点: 每个表达式经过计算最终会得到⼀个值,这个值叫做表达式的值.
在表达式运算的过程中,也会发⽣类型的⾃动提升,这个机制直接决定表达式值的类型
规则:
1. 当表达式中存在 double ---> 表达式的值类型为 double
2. 反之当表达式中存在float --> 表达式值的类型 float
3. 再反之当表达式中存在long ---> 表达式的值类型为 long
4. 其他情况都为 int
案例
public class Demo3{
public static void main(String[] args) {
//long a = 10;
//long result = a + 20;
//System.out.println(result);
byte a = 10;
byte b = 20;
byte result =(byte)(a + b);
System.out.println(result);
}
}
public class Demo4{
public static void main(String[] args) {
byte a = 10;
byte b = 20;
//⾃加、⾃减操作不改变变量的数据类型,这⾥的⾃加、⾃减可以看作是⾃⾝的改变,所以不改变数据类型        a += 2;
System.out.println(a);
//顺利编译运⾏,输出结果12
java变量的数据类型分为两种
b -= 3;
System.out.println(b);
//顺利编译运⾏,输出结果17
}
}
public class Demo5{
public static void main(String[] args) {
byte a = 10;
byte b = 20;
//需要强制类型转换
a = a + 2;
System.out.println(a);
//编译运⾏:
运⾏:javac Demo5.java
Demo5.java:7: 错误: 可能损失精度
a = a + 2;
^
需要: byte
到:    int
1 个错误
//若要顺利运⾏,需要进⾏强制转换
a = (byte)(a + 2);
System.out.println(a);
//顺利编译运⾏,输出结果12
}
}
总结
⾃动类型提升:
即范围⼩的数据类型可以直接转换为范围⼤的数据类型
要点:
(1) 数据类型兼容 byte short char int long .... 都属于数字类型,都是兼容的. boolean 是参与类型转换
(2)⼩范围的数据类型转换为⼤范围的数据类型
强制类型转换
⼤范围数据类型的变量/常量赋值给⼀个⼩范围数据类型的变量,需要进⾏强制转换.
要求:
数据类型之间要兼容
注意:
1. 强制类型转换可能会损失精度,得到错误的数据.
2. ⼩数类型强制转换为整数类型时,直接舍去⼩数部分,只保留整数部分.
表达式⾃动类型提升
在表达式运算的过程中,也会发⽣类型的⾃动提升,这个机制直接决定表达式值的类型
规则:
1. 当表达式中存在 double ---> 表达式的值类型为 double
2. 反之当表达式中存在float --> 表达式值的类型 float
3. 再反之当表达式中存在long ---> 表达式的值类型为 long
4. 其他情况都为 int
变量赋值时发⽣的数据类型提升要点:
⼀、在编译时,整数常量赋值给变量的时候,会直接算出结果,并且会⾃动判断该结果是否在该数据类型取值范围内
注意:
(1)整数类型中字⾯值常量的默认类型是int类型
(2)long类型的变量在定义的时候,当字⾯值超过int范围需要在字⾯值后加 L / l,建议 L
⼆、在为 byte short char 类型变量赋值的时候, 字⾯值类型默认都为int ,按照道理应该需要强制转换
例如:
byte b = (byte)10;
// 10 类型是int
但事实上我们会发现:
byte b = 10;
照样能顺利编译运⾏,
这是因为整数类型常量赋值在编译器编译的时候,会⾃动的加上强制转换 ,从⽽减少了程序员的⼯作量( 仅限整数常量赋值,⼩数赋值、表达式赋值不会 )
byte a = 123;
byte b = a;
能顺利编译运⾏;
short a = 123;
byte b = a;
不能顺利编译运⾏;
float a = 12.3;
不能顺利编译运⾏;编译提⽰:
需要: float
到: double
1 个错误
这是因为:
1. ⼩数类型的字⾯值常量默认类型是 double类型(且编译器不会⾃动强制转换)
2. float 类型变量在定义的时候,需要在字⾯值后加 F / f,建议F
3. double 类型的变量在定义的时候,可以在字⾯值后加 D / d,也可以不加.
4. 浮点型存储的数据是不精确的数据,所以在运算过程中,其结果也是不精确的.采⽤的科学计数法.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。