转换原因
Java是强类型语言,数据类型之间不能随意转换,但运算时数据类型不匹配,所以需要转换.
范围小的数据类型可以直接转换为范围大的数据类型
数据类型范围大小排序
要点
- 数据类型兼容 byte short char int long .... 都属于数字类型 都是兼容的
boolean 是参与类型转换- 小范围的数据类型 转换为 大范围的数据类型
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);
}
}
大范围数据类型的变量/常量 赋值 给一个小范围数据类型的变量,需要进行强制转换.
要求: 数据类型之间要兼容
目标数据类型 变量名 = (目标数据类型)原数据类型变量名/原常量值;
- 强制类型转换可能会损失精度,得到错误的数据.
- 小数类型强制转换为整数类型时,直接舍去小数部分,只保留整数部分.
案例
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 ,按照道理应该需要强制转换 ,但实际不强制转换也能编译通过,这是因为强制转换在编译器编译的时候会自动的加上。
```java
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 其实强制转换在编译器编译的时候,会自动的加上,从而减少了程序员的工作量
}
}
表达式: 由 变量 常量 运算符 组成的式子 叫做表达式的值
特点: 每个表达式经过计算最终会得到一个值,这个值叫做表达式的值.
在表达式运算的过程中,也会发生类型的自动提升,这个机制直接决定表达式值的类型
规则:
- 当表达式中存在 double ---> 表达式的值类型为 double
- 反之 当表达式中存在float --> 表达式值的类型 float
- 再反之 当表达式中 存在long ---> 表达式的值类型为 long
- 其他情况都为 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);
}
}
即范围小的数据类型可以直接转换为范围大的数据类型
要点:
(1) 数据类型兼容 byte short char int long .... 都属于数字类型,都是兼容的. boolean 是参与类型转换
(2)小范围的数据类型 转换为 大范围的数据类型
大范围数据类型的变量/常量 赋值 给一个小范围数据类型的变量,需要进行强制转换.
要求:
数据类型之间要兼容
注意:
- 强制类型转换可能会损失精度,得到错误的数据.
- 小数类型强制转换为整数类型时,直接舍去小数部分,只保留整数部分.
在表达式运算的过程中,也会发生类型的自动提升,这个机制直接决定表达式值的类型
规则:
- 当表达式中存在 double ---> 表达式的值类型为 double
- 反之 当表达式中存在float --> 表达式值的类型 float
- 再反之 当表达式中 存在long ---> 表达式的值类型为 long
- 其他情况都为 int
Java的基本数据类型是如何进行自动变量提升的——数据类型提升
原文:https://www.cnblogs.com/lsm-boke/p/14608212.html