Java有关byte强制类型转换的问题:

第一题:
byte b1=3,b2=4,b;
b=b1+b2;//错误 因为他们最终是要转向int类型 而int类型的值不能赋值给byte
b=3+4;//正确 因为他们都是常量 具有常量类型优化机制 可以直接识别为byte
哪句是编译失败的呢?为什么呢?
解析:
大部分的指令都没有支持byte、char、short,没有任何指令支持boolean类型。编译器在编译期或者运行期将byte和short类型的数据带符号扩展为相应的int类型数据,将boolean和char类型数据零位扩展为相应的int类型数据。
3+4是常量的计算,会优先执行,执行结果再赋值给byte,此时判断数值是否满足该类型范围,满足就直接赋值了。

总结

  • 两个变量相加,先对类型进行提升,然后运算,再将运算结果赋值。
  • 两个常量相加,先计算常量数值,然后判断是否满足类型范围,再赋值。

第二题:
byte b = 127;有没有问题?有问题如何解决?结果是多少呢?
b=(byte)b+1;
有问题 因为这个数超出了byte的取值范围 要用byte类型进行强制转换 结果是-128.
解析:
超过了byte类型的最大范围了,系统会强转,把int类型的前面三个高位丢弃,丢弃后,如果剩下的一位中,最高位为1,则取反加一,就成了负数了,如果最高位为0,直接把值赋给b 。

例子:当int转为 byte时,只取int的低8位,这里要注符号位的问题,如果int的二进制为:110111111(447),低8位为10111111,这时byte将最高位做为符号位,1为负,0111111(35),结果为-35,一个正的int型值,经过强制转化为负值,这点要注意,最好在程序中避免使用强制转化。
第三题:
byte b = 10;
b+=1;
b = b + 1;//失败 因为在和一个int类型的常量进行相加的时候b自动转换成int类型 而一个int类型的数据是没办法直接赋值给byte类型的变量的
哪句是编译失败的呢?为什么呢?
解析:
b += 1,其实等价于 b = (byte)(b+1);底层会对这个结果进行强转的,所以它编译的时候没事。但是不能超过范围。

注意:

最好在程序中避免使用强制转化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值