Java-基本数据类型之间的运算规则
# 前言
基本数据类型转换分为两种:
- 自动类型提升
- 强制类型转换
只是7种基本数据类型变量间的转换,不包含
boolean
类型。
# 自动类型提升
# byte和int
byte b1 = 2;
int i1 = 129;
int i2 = b1 + i1; // 131
1
2
3
2
3
当byte和int类型相加时,由于byte占用1个字节,int占用4个字节,当和int相加时,为了防止数据丢失,会自动转换为int类型。
# int和long
long l1 = b1 + i1;// 131
1
# float
float f = b1 + i1;//131.0
1
# char和short
short s1 = 10;
char c1 = 'a';
short s2 = s1 + c1;//报错
char c2 = s1 + c1;//报错
int res = s1 + c1;//107
1
2
3
4
5
6
7
2
3
4
5
6
7
short和char运算会自动提升为int类型
# char和byte
char c1 = 'a';
byte b2 = 10;
char c3 = c1 + b2;//报错
byte b3 = c1 + b2;//报错
int res = c1 + b2;//107
1
2
3
4
5
6
7
2
3
4
5
6
7
char和byte运算会自动提升为int类型
# byte和short
byte b3 = 3;
short s3 = 10;
byte b4 = b3 + s3;//报错
short s4 = b3 + s3;//报错
int res = b3 + s3;//13
1
2
3
4
5
2
3
4
5
byte和short运算自动提升为int类型
# 小结
容量小的数据类型变量和容量大的数据类型变量运算时,会自动提升为容量大的数据类型。
- 容量大小指的是,数据类型的范围
- 赋值(=)也是运算。
byte
、char
、short
三种类型的运算就提升为int
类型,因为java
在做运算的时候,如果操作数均在int
范围内,那么一律在int
的空间内运算。- 容量大小:byte、char、short >> int >> long >> float >> double
# 强制类型转换
什么叫强制类型转换?
自动类型提升运算的逆运算。
自动类型提升是把小容量的数据类型自动提升为大容量的数据类型,而强制类型转换则相反,是把大的数据类型转换为小的数据类型。
- 强制类型转换需要强转符:(),一对小括号
- 注意点:强制类型转换,可能导致精度损失。
# 精度损失举例1
double d1 = 12.3;
int i1 = (int)d1; // 12,截断操作。
1
2
2
# 没有精度损失
long l1 = 123;
short s2 = (short)l1;//123
1
2
2
long是8个字节,而short是2个字节,当long强转为short时,long砍掉6个字节,如果这6个字节本来是0的话,那就没有精度损失。
# 精度损失举例2
int i2 = 128;
byte b = (byte)i2;// -128
1
2
2
这里其实需要二进制层面去解释,后面再来填坑,但可以确定的是,这个案例也算是精度损失。
帮我改善此页面 (opens new window)
上次更新: 2020/12/18, 12:50:58