强制类型转换
只有把数值转换为同一类型后才能进行运算。
byte,short,char->int->long->float->double(优先级由低到高,实际上是和容量有关且小数的优先级大于整数)。
-
byte:1B
-
short:2B
-
char:2B
-
int,float:4B
-
long:8B
-
double:8B
1B即为1字节,1字节有8位,所以不同数据类型所能表示的数的范围是有限且不同的(计算机组成原理知识),当低转高时系统会自动进行,但是当高转低时需要进行强制类型转换。
溢出问题
高转低时还应注意溢出问题:
int i=128;
byte b=(byte)i;//强制类型转换,但是注意byte型只有8位,会产生内存溢出
System.out.println(i);
System.out.println(b);
上述代码将int类型强制转换为byte类型,但是byte只有8位无法表示128(计组知识不再赘述),所以转换后的输出结果不是原值。
低–>高
低转高可以直接进行,不需要强制类型转换,因为本身高优先级能表示数的范围比低优先级的大。
int m=128;
double n=i;//double类型自动转换了
System.out.println(m);
System.out.println(n);
精度问题
当把float或double强制转换为int时会造成精度的缺失,因为本身int是表示整数的。
System.out.println((int)23.7);//会直接省略小数;
System.out.println((int)-45.29f);
字符类型的转换
前面的文章已经说过字符本质上是数字。所以字符类型可以和int型数据直接进行计算(低->高可以自动转换),而将int类型数据转换为char类型时进行强制类型转换可以输出数字对应的字符。
char c='a';
int d=c+1;//低转高,自动转换为int类型
System.out.println(d);
System.out.println((char)(d));//高转低要强制转换
Tips:
- 不能对布尔值进行转换。
- 不能把对象类型转换为不相干的类型。(比如把string类型转换为int类型是不可取的)
- 把高容量转换到低容量时要强制类型转换,而且可能产生内存溢出或者精度问题
资料来源:b站搜索“遇见狂神说”