JAVA在数据类型之间的运算时会进行数据类型的转换,对初学者来说不了解数据类型转换在运行JAVA程序
时可能会被报错。
一般来说我们在运算时,要求参与运算的数据保持一致,当数据不一致时就会进行数据类型转换
1.下面说下JAVA数据类型
(1)Java是一种强类型语言,针对每种数据都提供了对应的数据类型。
(2)分类:
A:基本数据类型:4类8种
B:引用数据类型:类,接口,数组。
(3)基本数据类型
A:整数 占用字节数
byte 1
short 2
int 4
long 8
B:浮点数
float 4
double 8
C:字符
char 2
D:布尔
boolean 1
注意:
整数默认是int类型,浮点数默认是double。
长整数要加L或者l。
单精度的浮点数要加F或者f。
2.再来说下数据类型转换规则
(1)boolean类型不参与转换
(2)默认转换
A:从小到大
B:byte,short,char -- int -- long -- float -- double
C:byte,short,char之间不相互转换,直接转成int类型参与运算。
(3)强制转换
A:从大到小
B:可能会有精度的损失,一般不建议这样使用。
C:格式:
目标数据类型 变量名 = (目标数据类型) (被转换的数据);
3.看下具体的操作例子
class DataTypeText
{
public static void main(String[] args)
{
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;//属于类型提升,会报错
byte b4 = 3 + 4;//常量,不会报错
System.out.println(b3);
System.out.println(b4);
}
}
byte b3 = b1 + b2 编译失败,为什么呢?
而byte b4 = 3 + 4为什么又是被成功编译了呢?
两个变量相加,先对类型进行提升,然后运算,再将运算结果赋值。
b1与b2由byte型提升为了int型,又将int型赋予byte型的b3会造成精度丢失而报错
两个常量相加,先计算常量数值,然后判断是否满足类型范围,再赋值。
对于常量会先将结果算出,看是否在类型范围内,再赋值,byte的范围为-128~127,对于7在该范围内不会报错
class DataTypeDemo3 {
public static void main(String[] args) {
//定义一个byte类型,一个int类型,做加法
byte a = 3;
int b = 4;
System.out.println(a + b);
//可能损失精度
//byte c = a + b;
int c = a + b;
System.out.println(c);
}
}
默认转换(从小到大的转换)
A:byte,short,char—int—long—float—double
B:byte,short,char相互之间不转换,他们参与运算首先转换为int类型
首先看下面的间接输出 byte c = a + b 时为什么会报错,当int型的数据与byte型数据相加时首先byte型数据会被自动提升为int数据
然后两个int型数据相加的结果你放在byte型的变量中可能会造成放不下而造成精度损失(一个大碗与小碗中的东西相加,首先将小碗换成大碗,然后你要将两个大碗中的东西相加放在一个小碗中就会造成损失),如果你不想让它报错就要进行强制类型转换
将byte c = a + b 改为 byte c = (byte) (a + b),将大碗强制转换为小碗
强制转换
A:从大到小
B:可能会有精度的损失,一般不建议这样使用。
C:格式:
目标数据类型 变量名 = (目标数据类型) (被转换的数据);
来看下上面直接println(a + b)并不会报错因为你直接将结果输出了并没有将这个结果赋值于谁
class DataTypeDemo5 {
public static void main(String[] args) {
double d = 12.345;
float f = (float)d;
float f1 = (float)12.345;
float f2 = 12.345F;
}
}
思考题1:请问下面这个有没有问题
double d = 12.345;
float f = d;
有问题会报错,将double型赋值于float型会造成精度丢失
改进强制类型转换 改为 float f = (float) d
思考题2:看看下面两个定义有没有区别呢?
float f1 = (float)12.345;
float f2 = 12.345f;
上面的 f1其实是通过一个double类型转换过来的。(整数默认为int,浮点数默认为double)
而f2本身就是一个float类型。
思考题3:byte b = 130;有没有问题?如果我想让赋值正确,可以怎么做?结果是多少呢?
练习:byte b = (byte)300;
class DataTypeDemo7 {
public static void main(String[] args) {
//因为byte的范围是:-128到127。
//而130不在此范围内,所以报错。
//byte b = 130;
//我们可以使用强制类型转换
byte b = (byte) 130;
//结果是多少呢?
System.out.println(b);
}
}
分析过程:
我们要想知道结果是什么,就应该知道是如何进行计算的。
而我们又知道计算机中数据的运算都是补码进行的。
而要得到补码,首先要计算出数据的二进制。
A:获取130这个数据的二进制。
00000000 00000000 00000000 10000010(int数据4个字节)
这是130的原码,也是反码,还是补码。
B:做截取操作,截成byte类型的了。
10000010(byte数据一个字节)
这个结果是补码。
C:已知补码求原码。
符号位 数值位
补码: 1 0000010
反码: 1 0000001
原码: 1 1111110
以上是自己今天入门JAVA浅显的认识,下面推荐一个不错关于数据类型转换的博客