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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 三川草民 中级黑马   /  2015-9-24 20:27  /  641 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个面试题:
      byte b1=3,b2=4,b;
      b=b1+b2;
      b=3+4;
哪一句会编译失败呢,为什么?

9 个回复

倒序浏览

b = b1 + b2;会报错
b = 3 + 4;不会报错。

错误原因:涉及到编译器编译程序时候的细节,之所以byteb=3+7;,没有报错,是因为3和7都是
常量,编译器知道结果是10,并且在byte范围之内,因此就自动进行了强转,所以不会报错。而b=b1
+b2;中b1和b2都是变量,编译器编译程序是一行一行编译的,它根本不知道b1和b2到底是多少,两个
byte类型的数据相加时,首先都会被提升为int类型,他们的和也是int类型,其值可能会超过byte的范
围,因此就会报错。

点评

是不是byte,short都会被提升为int型呢,如果是long型会怎么办?  发表于 2015-9-24 22:32
回复 使用道具 举报
b = b1 + b2;会编译失败
                                *可以从两个方面解释
                                1 b1 b2 运算时 java 会将其转换为 int 型在运算 得到结果为 int 型 不能赋值给 byte b
                                2 b1 b2 是变量 jvm不能判断具体值 运算后可能超出 -128~127的范围
回复 使用道具 举报
  byte b1=3,b2=4,b;
      b=b1+b2;  //这句会编译出错,因为java底层会将byte数据在运算时会自动提升为int 类型,所以运算完返回的是   int类型,而byte不能接收int类型的值,需要强制转换
      
      b=3+4;  //这句不会,因为没有超过byte的范围
回复 使用道具 举报
byte b1=3,b2=4,b;
      b=b1+b2;
/*这句编译失败,java底层运算会将其数值自动提升为系统默认的int类型,运算结果为int类型,
将int类型赋予byte类型会容易导致数据溢出,丢失精度,所以需要进行强制转换,将b1+b2的
值转换成byte类型,即b=(byte)(b1+b2);
*/
      b=3+4;
回复 使用道具 举报
感谢楼下的回答,学到了。
回复 使用道具 举报
iceknc 中级黑马 2015-9-24 22:01:18
7#
学习了,其实我也答不上来
回复 使用道具 举报
残影 高级黑马 2015-9-24 22:26:01
8#
b=b1+b2;编译失败。因为计算的时候会自动提升为int类型,结果自然也是int类型,再赋值给byte类型会损失精度。需要强转。。。b =(byte)(b1+b2);明白了么。。
回复 使用道具 举报
b=b1+b2 看来大家都是很明白的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马