1.基本数据类型的关系
在java中,基本数据类型按照由低到高可以这样排序:
Java允许不同类型的变量相互赋值。其中,低类型数据可以不做任何处理直接赋值给高类型数据,这种类型转换是隐式的,如:
byte b =100;
int x = b;
这是允许的,因为高类型数据的取值范围大于低类型的取值范围,即低类型是高类型的一个子集,这种赋值是安全的,不会产生数据丢失,就好比一个小杯子的水倒入一个大杯子中
虽然这样可以在赋值前使用类型转换,不过这不是必须的,这个过程就像是先把杯子的水倒入一个临时大杯子中,再将临时杯子倒入另外一个大杯子中。 如;
short s =302;
long l =(long)s;//这种是多余的操作
相反,如果将高类型转给低类型数据,那么,这种赋值是不安全的,可能会产生数据丢失。好比你将一个大杯子的水丢入一个小杯子中,水可能会溢出。如果你仍要执行这种操作,那么编译器会强制你使用数据转换,否则无法通过,如:
short s =302;
byte b = (byte) s;//必须使用强制数据转换
在上面的复制中,byte数据占1字节,而short 数据占2字节,系统在赋值是直接将short类型变量的高8位截断,只将低8位给byte赋值。以上两种类型转换中,由低转高称为扩展,而高类型转低类型为窄向转换
2. Char、 short、byte 之间的转换
需要注意的是char类型。由于char是无符号类型(取值范围0-65535),无论是char类型还是short类型,还是char类型与byte类型,相互转换都是不安全的(不包括byte转short),即无论是谁赋值给谁,都需要类型转换,原因是char类型与short类型,char类型与byte类型,在数值取值范围上不存在子集关系.
char c= 'A';
byte b = -10;
short s =-50;
c=(char)b;
b=(byte)c;
c=(char)s;
s=(short)c;
尽管此例中的相互赋值没有任何意义,但是其说明了一点:在char类型与short类型,char类型与byte类型之间必须使用类型转换运算符
public class TypeCast { /** * 注释的语句是非法的,无法通过编译的 * * */ /* 在java中,如果两个或多个的类型不同,则运算结果与较高类型的操作数相同, 例如,int与long相加,结果为long类型,但是short char byte (或者三者混合时)结果为Int */ byte b= 1; short s=2; //short s2=b+s; s2的类型应为int }
更特殊的一点,负号-也是运算符,x可以使byte short char 那么-x就不是之前那个类型
如 byte b= 10;
byte b1 = -b;//编译提示错误,类型应为int
byte b2 = b+1//错误,类型为int
但是复合运算符就可以避免错误,
byte b = 0;
b+=1;//等价于 b = (byte)b+1;