----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------
自动类型提升与强制类型转换
类型的转换分为两种:自动类型提升和强制类型转换两种。
我们先从几个例子中进行比较:
一:自动类型转为问题
默认情况下,其顺序为:byte-->short-->int-->long-->float-->double
需要注意的是:所有的类型只要是碰到了String,则都会向String类型进行转换
例如:
intx=10;//定义一个整型变量
inty=80;//定义一个整型变量
Strings="hello";//定义一个字符串变量
System.out.println(s+x+y);//结果:hello1080;
System.out.println(x+y+s);//结果:90hello;注意两种不同结果的差别
System.out.println(s+(x+y));//结果:hello90;
友情提示:默认情况下,各个基本数据类型间是可以进行转型操作的:byte--short--int--long--float--double。但是所有的类型只要是碰到了String,则都会向String类型进行转换
二:强制类型转为问题
byteb=3;//定义一个byte类型的变量b并初始化值为3;
//b=b+4;
System.out.println(b);
这个时候我们会发现程序会报错,其原因是:4是int类型,它是由四个八位bit组成;b是byte类型,它是一个八位bit组成;这时涉及到的是:类型转换问题。所以我们需要强制转换:b=(byte)(b+4); 将int类型的结果(b+4)结果强制转换为byte类型
但是当b+=4的时候,这时又能通过编译,这时程序是:
byte b=3;//定义一个byte类型的变量b并初始化值为3;
//b=b+4;
b+=4;
System.out.println(b);
对于b+=4;这个表达式我们可以理解为:b=b+4;但是,+=是赋值运算符,赋值的是两边的和,并进行检查,底层自动进行转换动作。所以运行的时候编译器没有报错。
虽然强制类型转换可以将结果转换成你所需要的类型,但是,需要注意的问题是:容易丢失精度,一般本人不提倡使用
例如:一个int类型数据在计算机中存储的是:0000-00000000-0000 0000-0001 0000-0011 ,如果要求将该int类型的数据强制转换为byte类型的数据,结果就是:0000-0011 ;比较之后,很明显我们可以看出丢失了精度
我们可以来看一个例子:
byte b=3;//定义一个byte类型变量
b=(byte)(b+200);//将(b+200)的结果转换成byte类型,并赋值给b;很明显我们需要的结果是203
System.out.println(b);//输出结果b为-53
三:面试题:
byte b=3;
//b=4+7;
System.out.println(b);
对于上述的题目我们可以看出没有问题,其实这就相当于b=11;
那么我们再来看看下面的情况:
byte b=3;
byte b1=4;
byte b2=7;
b=b1+b2;
System.out.println(b);
这时候出现了这种情况:cannot convert from intto byte,为什么会出现这种情况呢?这时b=b1+b2;有人认为:b1+b2的结果和4+7的结果不是一样的吗?那么真的是一样的吗?
我们来分析一下:
(1)byte b=3;
3是int类型的数据;b是byte类型的变量,那么int类型的数据怎么赋值给byte类型的变量呢?
首先我们要明确的是:byte b=3;当编译器发现后面的数据是3时,编译器首先判断3是不是在byte的范围之内(-128~127),如果在,则默认强转并赋值给b;不在,则报错。
(2)b=b1+b2;
我们要先明确b1和b2是变量;这就意味着b1和b2的数值会变化的,也就是说b1和b2的值是不确定的,这时如果我们给b1或者b2重新赋值(b2=130;),这时的结果呢?
还有就是:b1和b2是变量;变量那么就意味着编译器无法检查。所以这时候如果你进行强制运行,那么编译器就会报错。
对于第一种情况:b=4+7;这时b右边的数值是固定的,则意味着编译器可以进行判断这个数据是否在byte范围之内。
下面我们在来看一题:
int x;
int x1=100;
int x2=108;
x=x1+x2;//
System.out.println(x);//208
这个时候运行是没有错误的,原因:
在计算机中,任何整数运算的结果还是整数。
我们在来看看另一种情况:
int x;
intx1=Integer.MAX_VALUE;
int x2=2;
x=x1+x2;
System.out.println(x);
int类型是32位类型的数据,对于超过的部分进行舍弃,这就意味着最高位就是1了,也就是负数
总结:默认int类型运算,一旦超过运算,底层则自动进行强制转换,保留自己原有位置,对于超过的部分全部舍弃。
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------