A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© luio 初级黑马   /  2014-6-30 20:57  /  1365 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

byte b1=3,b2=4,b;
b=b1+b2;
b=3+4;
哪句是编译失败的呢?为什么呢?

6 个回复

倒序浏览
应该是b=3+4;错了,
因为byte b1=3,b2=4,b;声明了b是byte类型的,
而b=3+4;    3+4是int类型,将int类型的值赋给byte类型的变量就错了,
想要自动转换类型的条件是目标类型必须大于原类型,这里需要强制转换类型

回复 使用道具 举报
直接写3和4默认是int型,而b是字节型。
回复 使用道具 举报
第二条语句编译失败
如果你真想给b赋值,应该写成b=(byte) (b1+b2);需要强制转换
b自动转型为int做加法,结果是int类型,把int类型赋给byte类型b,类型不符合,所以错误;
回复 使用道具 举报
本帖最后由 houyudong 于 2014-6-30 22:01 编辑

         byte b1=3,b2=4,b;
        b=b1+b2;//报错,因为java虚拟机在运算时会自动将b1和b2转换成int类型相加,所得的值是一个int类型的值,所以需要强转
         b=3+4;//byte类型的取值范围是-128到127,两个值相加编译器能够知道结果是多少,直接赋值没有问题,如果换成b=b1+4,就会报错,因为编译器不知道b1的值,他只知道b1是一个byte类型的变量,一个byte变量和一个int类型相加,会自动转换成int类型,

回复 使用道具 举报
楼上板凳和报纸的说法是对的。就此说明和补充一下此题。
  1. 一、运算符对基本类型的影响:
  2.   当使用+、-、*、/、%运算符对基本类型进行运算时,遵循如下规则(JVM默认自动转换优先级):
  3. 只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型;
  4. 否则,只要两个操作数中有一个是float类型的,另一个将会被转换成float类型,并且结果也是float类型;
  5. 否则,只要两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型;
  6. 否则,两个操作数(包括byte、short、int、char)都将会被转换成int类型,并且结果也是int类型。
复制代码
  1. 二、代码分析:
  2.   byte c = a+b//编译失败,虽然a和b都是byte类型,但是做加法运算JVM会默认自动提升为int类型,相加后也是int类型,左右两边类型不符,内存大小不等,固然编译不过。
  3. b = 3+4;//虽然3和4都是整数,都是固定的常量,b是byte类型,但是b的值域是[-128~127],只要在这个范围内常量是可以直接赋值的,所以编译通过。
复制代码
回复 使用道具 举报 1 0
b = b1 + b2;这一句会报错,会提示损失精度,b1和b2为byte型,但是在参与运算时会自动提升为int型,b1+b2运算结果也是int型,将int型再赋值个byte型的b就会提示会损失精度。
b = 3 + 4;这一句不会报错,3和4为常量,只要3+4的值不超过byte的最大取值范围127就不会提示损失精度。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马