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

----------------------- 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);

这个时候我们会发现程序会报错,其原因是:4int类型,它是由四个八位bit组成;bbyte类型,它是一个八位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的结果不是一样的吗?那么真的是一样的吗?

我们来分析一下:

1byte b=3;

 3int类型的数据;bbyte类型的变量,那么int类型的数据怎么赋值给byte类型的变量呢?

首先我们要明确的是:byte b=3;当编译器发现后面的数据是3时,编译器首先判断3是不是在byte的范围之内(-128~127),如果在,则默认强转并赋值给b;不在,则报错。

2b=b1+b2;

我们要先明确b1b2是变量;这就意味着b1b2的数值会变化的,也就是说b1b2的值是不确定的,这时如果我们给b1或者b2重新赋值(b2=130;),这时的结果呢?

还有就是:b1b2是变量;变量那么就意味着编译器无法检查。所以这时候如果你进行强制运行,那么编译器就会报错。

对于第一种情况: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学习型技术博客、期待与您交流! ----------------------

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值