package myJavaNotes;
/**
* 类型自动转化
*@author 康爸爸
*@date: 2020年1月21日 上午3:32:08
*
*/
/**
* 强制类型转换
*@author 康爸爸
*@date: 2020年1月21日 下午9:04:41
*
*/
/**
* 溢出
*@author 123
*@date: 2020年1月21日 下午9:58:50
*
*/
public class TypeConversion {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//类型自动转化,容量小的数据类型可以自动转换位容量大的数据类型
// 容量的大小是指表示的范围。
//例:long类型(8个字节)可以自动转化位float(4个字节)类型,即,long类型的变量可以给float类型赋值
//其他类型需要使用强制转换类型()
/**
* char
* ↓
* byte→short→ int → long↙。。。
* . ↘ .
* v v
* float→double
*
*
* int可以自动转化为short、byte、char类型,不需要进行强制类型转换,只要不超出short、byte、char类型范围即可
* 例:short b = 12;合法
* short b = 1234567;非法,1234567超出了short的表示范围
* */
int a = 34;
long b = a;//合法,int类型自动转换为long类型
double d = a;//合法,int类型自动转换为double类型
//float f = 1.0;//非法, = 后面的数值为double类型,不能自动转化为float类型
float f = 3;
d = f;//合法,float类型自动转换为double类型
f = a;//合法,int类型自动转换为float类型,但是会有精度缺失
f = b;//合法,long类型自动转换为float类型,但是会有精度缺失
d = b;//合法,long类型自动转换为double类型,,但是会有精度缺失(虚线)
//特例
char q = 123;//等号右边为 int类型且未超过char类型的表示范围,自动转换为char类型
byte w = 123;//等号右边为 int类型且未超过byte类型的表示范围,自动转换为byte类型
short e = 123;//等号右边为 int类型且未超过short类型的表示范围,自动转换为short类型
//但是不能用变量给 char、byte、short赋值,只能用常量
//例:q = a;中a为int类型变量,给char类型的q赋值是非法的
//q = a;//非法
System.out.println("===============================================");
/*
* 强制类型转换:(type)variable
*
* */
System.out.println(q);//输出char类型q == ‘{’
System.out.println((int)q);//将char类型强制转换成int类型
System.out.println("==================================================");
/**
* 1、溢出:操作比较大的数时,要注意是否溢出(结果比要表示的范围大,或者为负数)
* 2、尽量不要命名名字为l的变量,l容易与数字1混淆。
* 3、long类型的变量在赋值时,= 等号右边的常量末尾尽量用大写L结尾,不要用小写l
* */
int money = 1000000000;//10亿
int years = 20;
int total = money * years;
System.out.println("total = "+total);//返回的total时负数,超出了int的范围,溢出;
long total1 = money * years;
System.out.println("total = "+total);//返回的toutal任然时负数。money和years默认时int,因此money*int的结果为int类型,再转换成long类型,但是在int类型的过程中已经溢出,发生数据丢失;
long total2 = money * (long)years;
System.out.println(total2);//返回的total2==20000000000 正确。years先被转换成long类型,而int类型*long类型的结果为long类型,所以未发生溢出,数据未丢失,结果正确
//命名问题
int l = 2;//不太容易分清是小写L还是1
long s = 2345l;//不太容易区分结尾是小写L还是1
}
}