黑马程序员技术交流社区

标题: 一个面试题 [打印本页]

作者: 三川草民    时间: 2015-9-24 20:27
标题: 一个面试题
一个面试题:
      byte b1=3,b2=4,b;
      b=b1+b2;
      b=3+4;
哪一句会编译失败呢,为什么?
作者: 太子奕    时间: 2015-9-24 20:39

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

错误原因:涉及到编译器编译程序时候的细节,之所以byteb=3+7;,没有报错,是因为3和7都是
常量,编译器知道结果是10,并且在byte范围之内,因此就自动进行了强转,所以不会报错。而b=b1
+b2;中b1和b2都是变量,编译器编译程序是一行一行编译的,它根本不知道b1和b2到底是多少,两个
byte类型的数据相加时,首先都会被提升为int类型,他们的和也是int类型,其值可能会超过byte的范
围,因此就会报错。
作者: hepann    时间: 2015-9-24 20:46
b = b1 + b2;会编译失败
                                *可以从两个方面解释
                                1 b1 b2 运算时 java 会将其转换为 int 型在运算 得到结果为 int 型 不能赋值给 byte b
                                2 b1 b2 是变量 jvm不能判断具体值 运算后可能超出 -128~127的范围

作者: 蔡鹏飞    时间: 2015-9-24 21:11
  byte b1=3,b2=4,b;
      b=b1+b2;  //这句会编译出错,因为java底层会将byte数据在运算时会自动提升为int 类型,所以运算完返回的是   int类型,而byte不能接收int类型的值,需要强制转换
      
      b=3+4;  //这句不会,因为没有超过byte的范围
作者: 晓随缘    时间: 2015-9-24 21:39
byte b1=3,b2=4,b;
      b=b1+b2;
/*这句编译失败,java底层运算会将其数值自动提升为系统默认的int类型,运算结果为int类型,
将int类型赋予byte类型会容易导致数据溢出,丢失精度,所以需要进行强制转换,将b1+b2的
值转换成byte类型,即b=(byte)(b1+b2);
*/
      b=3+4;
作者: charlie    时间: 2015-9-24 21:51
感谢楼下的回答,学到了。
作者: iceknc    时间: 2015-9-24 22:01
学习了,其实我也答不上来
作者: 残影    时间: 2015-9-24 22:26
b=b1+b2;编译失败。因为计算的时候会自动提升为int类型,结果自然也是int类型,再赋值给byte类型会损失精度。需要强转。。。b =(byte)(b1+b2);明白了么。。
作者: 冰霜之卅    时间: 2015-9-24 23:36
b=b1+b2 看来大家都是很明白的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2