您的位置:首页 > 职场人生

黑马程序员--类型转换问题

2013-02-11 10:13 309 查看
-----------------------
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学习型技术博客、期待与您交流!
----------------------
 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息