数据类型转换:
隐式转换
- 转换规则: byte, short, char —- int —- long —- float —- double
- 整数默认是int类型, 浮点数默认是double类型
上述规则用几个例子来解释:
示例1:
int a =1;
short sh1 = 1;
short sh1 = sh1 + 1;//错误
int c = a + sh1; //正确
short sh2 = a + sh1;//错误
long l1 = 111111111111L;
long l2 = 111111111111L;
long l3 = l1 + l2;//正确
大容器承接小容器按照转换规则进行;
整型在进行运算时, 若数据类型小于int, 则会自动提升为int (故long类型运算时并不会变成int类型)
示例2:
float f1 = 1.2F;
float f2 = 2.3F;
float f3 = f1 + f2;//正确
float f4 = f1 + 1.2;//错误
float 类型之间进行运算时, 不会提升类型, 但是浮点数常量默认为double类型, float类型与 double类型运算时, 类型提升为double.
示例3:
byte by1 = 1;
byte by2 = 1;
short sh = 1;
char ch = ‘0’;
sh = by1 + sh;//错误
ch = by1 + ch// 错误
byte by3= by1 + by2;//错误
byte by3= by1 + 1;//错误
byte由于运算时升级成int 类型, 编译报错; short, char 同byte, 并且这三个类型之间直接进行运算也都会报错.
示例4:
byte a = 1;
byte a += 1;//正确
扩展运算符隐含了强制转换, 相当于 a = (byte) (a + 1);
示例5:
byte b = 3 + 4;//正确
常量优化机制,编译时,会优先计算3+4的结果,如果其结果在byte取值范围内,则通过,如果不再byte的取值范围内,则报错
强制转换
目标类型 变量名 = (目标类型) (被转换的数据)
示例1:
char ch = ‘a’;
ch += 1;
int b = (int) ch;
强制转换时, 要注意变量所能接受的数值范围, 若超出了范围, 会丢失精度.
示例2:
Int a1 = 10;
byte b1 = (byte) a1; //值为10
int a2 = 200;
byte b2 = (byte) a2; //值不为200, 丢失精度
由于byte 的数值范围是 -128~127, 上述 b1的值 10 得以保留, 而 b2 则不能保存 200的数值, 损失了精度.