3.3 基本数据类型转换
数值类型在内存中直接存储其本身的值,对于不同的数值类型,内存中会分配相应的大小去存储,它们的取值范围也各不相同,如:byte类型的变量占用8位,int类型变量占用32位等。下图中依次表示了各数值类型的字节数和相应的取值范围。
-
在Java中,整数类型(byte/short/int/long)中,对于未声明数据类型的整型,其默认类型为int型。
System.out.println(1);//int类型 System.out.println(1l);//long类型
-
在浮点类型(float/double)中,对于未声明数据类型的浮点型,默认为double型。
System.out.println(2.0);//double类型 System.out.println(2.0f);//float类型
数据类型自动转换
-
转换顺序
byte → short → int→ long → float →double
-
转换规则
-
int以下的类型计算(byte、short、char)
所有的byte类型和short类型和char的值运算的,任意两种进行计算,结果都会转成int类型
//byte + byte = int类型 byte b2 = 10; byte b3 = 20; System.out.println(b2 + b3);//该结果为int类型 //byte b4 = b2 + b3; //该代码将出现错误 //byte + short = int类型 short s2 = 10; System.out.println(b2 + s2);//该结果为int类型 //short s4 = b2 + s2; //该代码将出现错误
-
int类型及以上类型同类型计算
int long float double 自身计算的时候没有类型提升
如:int + int = int ,long + long = long,超出范围最大值或最小值,就会出现物极必反的情况
int i2 = 2147483647;//int类型最大值 int i3 = 2147483647;//int类型最大值 System.out.println(i2 - 1);//返回-2147483648,该返回值为int类型最小值,物极必反 System.out.println(i2 + i3);//返回-2,此时出现了物极必反
-
int long float double 不同类型来计算
小的数据类型常量或变量将会向大的数据范围转换
- 如果两个操作数中有一个是double类型,另一个就会转换为double类型
- 否则,如果有一个操作数是float,另一个就会转化为float;
- 否则,如果有一个操作数是long,另一个就会转换为long;
- 否则,两个操作数都将转换为int类型。
-
boolean类型就已经内定了2个值,true和false,所以不能够参与计算
-
-
char类型的转换
转换规则:(char)→ int
char类型可以参与计算,char和int能够自动转换,因为它们具备一定的对应关系,可以查看ASCII码表
char型其本身是unsigned型,同时具有两个字节,其数值范围是0 ~ 216-1,因为,这直接导致byte型不能自动类型提升到char,char和short直接也不会发生自动类型提升(因为负数的问题)。
数据类型强制转换
强制类型转换:从存储范围大的类型到存储范围小的类型
double→float→long→int→short(char)→byte
-
整数类型的强转
大范围→小范围,值不准确
-
小数类型的转换
小数→整数,小数点会去掉
-
字符的转换
char c1 = '中'; System.out.println((int)c1);//输出20013,表示中这个字符对应的int类型的数字为20013 int i4 = 97; System.out.println((char)i4);//输出a,a字符对应的int类型数字为97
注意:由于强转换出现精度丢失问题,所以我们在使用强制转换时,需要明确知道被转换类型能否容纳得下当前值。
基本数据类型练习
1、float f=3.4;是否正确?
2、short s1 = 1; s1 = s1 + 1;有错吗?