← 返回首页
JavaSE系列教程(六)
发表时间:2019-11-24 20:25:39
讲解基本类型之间的转换

JAVA中除了布尔类型的数据外,其他的7种基本数据类型之间可以相互转换。 转换方式分两种:自动类型转换和强制类型转换:

1.自动类型转换

所谓自动类型转换,是指系统支持把某种基础类型直接付给另一种基础类型的变量。 注意:自动类型转换的前提条件,必须是把表数范围小的数值或变量赋给表数范围大的变量。简单来说就是低精度的变量可以自动赋值给高精度变量。转换关系如下:

例如:

int n= 100;
float f = 3.14f;
long l = n;
double d = f;
char c = '中';
int num = c;  //num里保存了'中'这个字符的unicode编码

运行结果:
100
3.140000104904175
20013

其实很好理解,我们都知道数值型类型主要区别是分配的内存空间大小不同,可以想象一杯水往一个容积大的空桶之中倒进,水不会流出来,相反如果一桶水往一个小的空间杯子里面倒进的时候,水就会溢出。

2.强制类型转换

同样的,小桶里的水可以倒到大桶里面,难道大桶里面的水不能够到进入小桶里面吗?正所谓艺术源于生活,代码何尝不是,只要是大桶里面的水没有超过小桶的容积,就可以到进去。所以,java引入了强制转换的概念。 强制转换的语法格式是:(targetType)value,强制转换的运算符是圆括号(())。 强制转换需要注意点: 1).把一个浮点数强制转换为整数时,java会直接截断浮点数的小数部分。 2).把一个超出数据范围的数值赋给数据类型是,会出现数据溢出的情况,造成数据的缺失。

例如:把233强制类型转换为byte类型的整数,而变成-23,其中里面的变化如下图。

如上图32位int类型的233在内存中如上图所示,强制类型转换为8位的byte类型,则需要截断前面24位,只保留右边8位,最左边的1是一个符号位,此处表明这是一个负数,负数在计算机里面是以补码形式存在的,因此还需要换算成原码。将补码建议就得到反码形式,再将反码取反就可以得到原码。

通常情况下,字符串不能直接转换成基本类型,但是可以通过基本类型对应的包装类则可以实现把字符串转换成基本类型。 java为8种基本类型都提供了对应的包装类:boolean 对应 Boolean 、byte 对应 Byte、short 对应 Short、int对应Integer 、 long 对应 Long、char 对应 Character 、float对应Float 、double 对应 Double。

原码:机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。

反码:正数的反码还是等于原码,负数的反码就是他的原码除符号位外,按位取反。

补码:正数的补码等于他的原码,负数的补码等于反码+1。

byte b = (byte)233;
System.out.println(b);

运行结果:
-23

3.表达式类型自动提升

还有一种隐性的方式--表达式类型转换。表达式归根到底属于自动类型转换的范畴之中。 表达式类型转换的自动提升规则:

1)所有的byte类型、short类型将被提升到int类型 2)整个算数表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。 例如:

short s1 = 3;
short s2 = 4;
short s3 = s1+s2;

这个时候会报错,因为s1+s2表达式已经被提升到int类型,而把int类型的赋给short,会引发错误。正确的写法如下:

short s1 = 3;
short s2 = 4;
short s3 =s1;
s3+=s2;

或者

int s3 = s1+s2;