第一条:八种基本数据类型中,除boolean 类型不能转换,剩下七种类型之间都可以进行转换
第二条:如果整数型字面量没有超出byte,short,char的取值范围,可以直接将其赋值给byte, short, char类型的变量。
//java语言规定,字面量默认当作整形处理
byte y=127;
short s=100;
//97是整形,Java语言规则,默认整形处理
//c2是char类型
char c2=97;
System.out.println(c2);//输出 a 这个字符
第三条:小容量向大容量转换称为自动类型转换,容量从小到大的排序为:byte < short (char) < int < < long < float < double, 其中short和 char都占用两个字节,但是char可以表示更大的正整数。整数型的容量都比浮点型小。
/*
关于java语言中的浮点型数据
浮点型包括 float 4个字节 单精度
double 8个字节 双精度
double更精确
比如说:
10.0/3 如果用float 来存储的话结果可能是3.33333
10.0/3 如果用double 来存储的话结果可能是3.33333333
但是需要注意的是,如果用在银行财务方面,这两种精度是远远不够的,因此
在Java中提供了一种精度更高的类型,这种类型专门使用在财务软件方面:java.math.BigDecimal(不是基本数据类型,是引用数据类型)
float和double存储数据的时候,都是存储的近似值,因为现实世界中的数据有无线循环小数,计算机的存储空间有限,因此只能存储近似值
float4个字节,long类型8个字节,谁的容量大?
任意一个浮点型都比整数型空间大(不能只看字节,float内部的构造复杂,有次幂)
float容量>long容量
Java语言中规定:任何一个浮点型数据都被当作double类型来处理
如果想要这浮点型字面量被当作float类型处理,在字面量后面加"F"或者"f"。
例如:1.0默认被当作double类型来处理
1.0F这才是float类型(1.0f)
*/
public class FloatTest01{
public static void main(String[] args){
//3.1415926默认被当作double类型,不存在类型转换
double pi=3.1415926;
System.out.println(pi);
//float f=3.14;错误: 不兼容的类型: 从double转换到float可能会有损失
//怎么修改上句代码了?
float f1=3.14f;
System.out.println(f1);
float f2=3.14F;
System.out.println(f2);
float f3=(float)3.14;//强制类型转换
System.out.println(f3);
//运算原理:先将5转换成double类型,然后再做运算,其结果是double类型
//大容量无法直接赋值给小容量
//int i=10.0/5;错误: 不兼容的类型: 从double转换到int可能会有损失
//怎么修改?
int i=(int)10.0/5;//只保留整数部分
System.out.println(i);//输出结果2
int x=(int)(10.0/5);
System.out.println(x);
}
}
第四条:大容量转换成小容量,称为强制类型转换,编写时必须添加、强制类型转换符",但运行时可能出现精度损失,谨慎使用。
//300被默认当做int类型
//b变量是byte类型
//大容量转换成小容量,要想编译通过,必须使用强制类型转换符
//报错:IntTest04.java:8: 错误: 不兼容的类型: 从int转换到byte可能会有损失
byte b=300;
//int类型300:00000000 00000000 00000001 00101100
//byte是1个字节,砍掉前面3个字节,剩下00101100=44
byte b=(byte)300;
System.out.println(b);//输出值是44
//150超过了byte类型的取值范围[-128到127],需要强转
//byte b=150;错误: 不兼容的类型: 从int转换到byte可能会有损失
//整型150=00000000 00000000 00000000 10010110
//强制类型转换后:byte(150)=10010110
//10010110,最高位为符号位,补码形势,转换成源码是:11101010=-106
byte b=(byte)150;
System.out.println(b);//输出-106
第五条: byte ,short,char类型混合运算时,先各自转换成int类型再做运算
/*
结论:byte,char,short做混合运算时,各自先转换成整型再做运算
*/
public class IntTest06{
public static void main(String[] args){
char c1='a';
byte b=1;
//这里的"+"负责求和
//输出结果=98
System.out.println(c1+b);
//疑问:c1+b=98没有超过short的范围,为什么还会报错了?
//编译的时候,只能检测到这里是一个加法运算,编译器不知道这个加法运算的结果是多少。
//short s=c1+b; 错误: 不兼容的类型: 从int转换到short可能会有损失,说明c1+b是整型
short s1=(short)(c1+b);
short s2=98;//这一句编译器直接检测到了这个数值,因此不会报错
System.out.println(s1);
int n=1;
//short h=n;错误:不兼容的类型: 从int转换到short可能会有损失.还是那句话,编译器检测不到n里面的值是多少
}
}
第六条:多种数据类型混合运算,各自先转换成容量最大的那一种再做运算
long a=10L;
char c='a';
short s=100;
int i=30;
//求和
System.out.println(a+c+s+i);//输出结果:237
//int x=a+c+s+i; 错误: 不兼容的类型: 从long转换到int可能会有损失
int x=(int)(a+c+s+i);
System.out.println(x);//输出结果237