java基本数据类型的自动和强制转换区别
1、基本数据类型:byte,short,int,long,float,double,char,boolean,四类八种。
①整型:
byte,占1字节内存,范围为-127~128。
short,占2字节内存,范围~为-32768~32767。
int,占4字节内存,范围为约-21亿~21亿,具体为-2147483648~2147483648。
long,占8字节内存,范围为-2^63~2^63-1。
②浮点型:
float,占4字节内存,范围为-3.403E38~3.403E38。
double,占8字节内存,范围为-1.798E308~1.798E308。
③字符型:
char,占2字节内存,表示一个字符,如(‘A’,‘a’,‘国’),范围为整个Unicode字符集 。
④布尔型:
boolean,占1字节内存,只有两个值true和false。

2、自动(隐式)数据类型转换:将取值范围小的类型自动提升为取值范围大的类型 。byte、short、char 运算时直接提升为 int 。boolean类型不能发生数据类型转换。整型数据类型默认是int类型。浮点型数据类型默认是double类型。byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double。
(1)
①int类型和byte类型运算,结果是int类型,byte类型自动提升为int类型。
int a = 1; byte b = 2;
// byte x = a + b; // 报错,byte类型装不下int类型
int y = a + b; //int+byte-->int+int-->int
System.out.println(y);//3
②int类型和double类型运算,结果是double类型,int类型会提升为double类型 。
int i = 1; double d = 2.5;
//int e =d+i; //报错,int类型装不下double类型
double e = d+i; //int+double-->double+double-->double
System.out.println(e); //3.5
3、(2)
①左边是double类型,右边是float类型,左右不一样。
double num = 2.5F;// float --> double,符合从小到大的规则,自动转换。
System.out.println(num); // 2.5
②赋值时,右侧的数值大小不能超过左侧的类型范围。
byte num4 = 40; // 注意!右侧的数值大小不能超过左侧的类型范围
byte num5 = 50;// byte + byte --> int + int --> int
int result1 = num4 + num5;
System.out.println(result1); // 90
③浮点型之间的运算可能不太准确。
float a = 1.1F; float b = 2.2F;
//int i = a + b; // 报错,int类型装不下double类型
float i = a+b;
System.out.println(i);//3.3000002
4、(3)
char 运算时直接提升为 int 。 计算机的底层会用一个数字(二进制)来代表字符A,就是65。一旦char类型进行了数学运算,那么字符就会按照一定的规则翻译成为一个数字。
char c= 'A'; // 这是一个字符型变量,里面是大写字母A
System.out.println(c + 1); // 66,也就是大写字母A被当做65进行处理。char+int-->int+int-->int。
5、强制类型数据转换:
将取值范围大的类型强制转换成取值范围小的类型 。
强制转换的格式:数据类型 变量名 = (数据类型)被转数据值;
强制转换的注意事项:如果超出了被赋值的数据类型的取值范围得到的结果会与你期望的结果不同 。
(1)浮点转成整数,直接取消小数点,可能造成数据损失精度。
//int a = 1.5; // 错误
int a = (int)1.5;//正确,不会四舍五入,小数点后面的数据直接舍去,a 的值变为1。//double-->int
System.out.println(a); //1
6、(2)
①int 强制转成 short 砍掉2个字节,可能造成数据丢失。
int b =(int)2.3;//b的值为2
short c =1;
//c =b+c; //错误
c=(short)(b+c);//编译成功//int +short-->int+int-->short+short-->short
System.out.println(c); //3
②赋值时,右侧的数值大小不能超过左侧的类型范围,超出会报错,进行强转后不报错,但数据会溢出、丢失。
byte num1 = (byte)4000; //数据超出byte范围
byte num2 = 50;
int result= num1 + num2;
System.out.println(result); // -46,数据出现异常
7、(3)左边是int类型,右边是long类型,不一样,long --> int,不是从小到大
,需强转为int类型。
int num = (int)30L;
System.out.println(num);// 30
8、(4)int强制转换为short:注意必须保证逻辑上真实大小本来就没有超过short范围,否则会发生数据溢出。
byte num1 = 40;
short num2 = 60;
short result = (short) (num1 + num2);// byte + short --> int + int --> int
System.out.println(result); // 100