1、基本数据类型转换
前提:这里讨论的只是7种基本数据类型变量间的运算。不包含boolean
类型的。
1.1、自动类型提升
- 自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序:
char
、byte
、short
——>int
——>long
——>float
——>double
- 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后进行计算。
-
byte
、short
、char
之间不会互相转换,他们三者在计算时首先转换为int
类型。
byte b1 = 2;
int i1 = 129;
// 编译不通过
// byte i2 = b1 + i1;
int i2 = b1 + i1;
-
boolean
类型不能与其他数据类型计算。 - 当把任何基本数据类型的值和字符串(
String
)进行连接运算(+
)时,基本数据类型的值将自动转换为字符串(String
)类型。
2、强制类型转换
- 强制类型转换:自动类型提升的逆运算。
- 需要使用强转符:
()
- 注意点:强制类型转换,可能导致精度损失。
- 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。
-
boolean
不可以转换为其他的数据类型。
// 精度损失举例1
double d1 = 12.3;
int i1 = (int)d1; // 截断操作
System.out.println(i1); // 12
// 没有精度损失
long l1 = 123l;
short s2 = (short)l1;
// 精度损失举例2
int i2 = 128;
byte b = (byte)i2;
System.out.println(b); // -128
3、变量运算规则的两个特殊情况
3.1、
// 1.编码情况1:long型变量后面没加l,相当于变量提升 int --> long
long l1 = 123123;
System.out.println(l1);
// 编译失败:过大的整数,当成int类型存储
// long l2 = 3434324342342353452;
long l2 = 3434324342342353452l;
// 编译失败:float一定要加f
float f1 = 12.3;
3.2、
// 2.编码情况2:
// 整形常量,默认类型为int型
byte b = 12;
// 编译失败
// byte b1 = b + 1;
// 浮点型常量,默认类型为double型
// 编译失败
// float f1 = b + 12.3;
4、String类型变量的使用
-
String
属于引用数据类型,翻译为:字符串。 - 声明
String
类型的变量时,使用一对""
。
String s1 = "Hello World!";
System.out.println(s1);
String s2 = "a";
String s3 = "";
// 编译不通过
// char c = '';
-
String
可以和8
种基本数据类型做运算,且运算只能是连接运算:+
,运算的结果仍然是String
类型。
int number = 1001;
String numberStr = "学号:";
String info = numberStr + number; // +:连接运算
System.out.pringln(info);
5、二进制转十进制
- java整数常量默认是
int
类型,当用二进制定义整数时,其第32位(最高位,从左往右第一个数字)是符号位;当是long
类型时,二进制默认占64位,第64位(最高位)是符号位。 - 计算机以二进制的形式保存所有的整数。
1.正数的原码、反码、补码都相同。
2.负数的补码是其反码+1。 - 二进制的整数有如下三种形式:
1.原码:直接将一个数值换成二进制数。最高位是符号位。
2.负数的反码:是对原码按位取反,只是最高位(符号位)确定为1。
3.负数的补码:其反码加1。
注意:计算机底层都以补码的方式来存储数据!
6、二进制与八进制十六进制之间的转换
6.1、二进制转八进制
6.2、八进制转二进制
八进制数通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零。
6.3、二进制转十六进制
6.4、十六进制转二进制
十六进制数通过除2取余法,得到二进制数,对每个十六进制为4个二进制,不足时在最左边补零。