黑马程序员技术交流社区

标题: 小白求教一道基础思考题 [打印本页]

作者: 岁月如歌2013    时间: 2015-5-9 17:04
标题: 小白求教一道基础思考题
正在看毕老师基础教程的第二天,有一道思考题是这样的
byte b1=3,b2=4,b;
                b=b1+b2;
                b=3+4;

问这个语句哪句编译失败,然后我试了一下
提示b=b1+b2这句报错:错误: 不兼容的类型: 从int转换到byte可能会有损失
当我把这句注释掉之后就不报错了,然后我让系统打印出来,结果又报错了,我是这么写的
class Day02
{
                public static void main(String[] args)
        {
                byte b1=3,b2=4,b;
                b=b1+b2;
                b=3+4;
                System.out.println(b);
        }
}

错误: 找不到或无法加载主类 day02

求教前辈,这两个错误都是怎么来的,真心找不出来


作者: 岁月如歌2013    时间: 2015-5-9 17:16
第二个错误发现了,大小写的问题。
作者: 岁月如歌2013    时间: 2015-5-9 17:17
第一个错误还是找不到原因,求教
作者: yky1678    时间: 2015-5-9 17:29
本帖最后由 yky1678 于 2015-5-9 17:45 编辑

b=b1+b2;错误原因分析
b1:8位二进制   
b2:8位二进制
两个八为二进制相加,最高位可能会产生进位,最后相加结果变为9位,将这个9位二进制赋值给byte变量,当然会报错,所以java就不能直接这么相加(语法上就不允许了,所以编译错误)修改方法:b=(byte)(b1+b2);  //强制转化为byte型
这样编译就能够通过了。

刚刚看到一个哥们说byte类型运算会提升为int型,于是网上查了下,果然如此,byte、short、char运算时都会提升为int型运算,所以运算后不经过强制转换不不能通过编译的。谢谢刚刚那个不知名的哥们了。

作者: 200米王朝    时间: 2015-5-9 17:30
b=b1+b2;   错误

意思是 b1和b2先自动提升为int类型, 并运算. 将运算后的结果赋值给byte类型的b , 损失精度.
为什么运算前要先自动提升为int? 因为这是JAVA设定的机制.

而 b = 3+4 是正确的, 因为他是常量相加, 结果7在缓冲池中存在(-128~127), 所以可直接复制给byte类型的b,

作者: 岁月如歌2013    时间: 2015-5-9 17:43
yky1678 发表于 2015-5-9 17:29
b=b1+b2;错误原因分析
b1:8位二进制   
b2:8位二进制

谢谢!果然解决了~{:2_32:}
作者: 348532020    时间: 2015-5-9 17:52
我觉得2楼的答案更标准一点,我的想法和他一样。在他的答案的基础上我再修改一小部分。
b=b1+b2;   错误

意思是 b1和b2先自动提升为int类型, 并运算. 将运算后的结果赋值给byte类型的b , 损失精度.
为什么运算前要先自动提升为int? 因为这是JAVA设定的机制.
这些类型由低级到高级分别为(byte,short,char)--int--long--float--double
byte,short,char 类型运算时候都会自动提升到int类型,所以b1, b2 相加完成以后是int类型。
其实内部的程序过程是这样 byte b = (int)b1 +(int) b2 ; 就是说 ,b1 和b2 都已经被默认提升到int类型了,计算结果是int 类型,而b 还是byte , byte 是一个字节,而int 是4个字节,int数据范围远大于byte ,自然很可能超出精度,系统就会报错。
向上转型(由低级到高级就叫向上转型)是自动的,比如你用long 类型的   long lg = b1+ b2; 结果会自动提升到long 类型。 但是由上向下自动转是不可以的。
byte b  =(byte) (b1 + b2); 这个是向下转型。 意思是b1 b2 默认转换成int 类型计算完成以后向下转型成byte 类型,然后再赋值给 byte类型的b 。这样没有任何问题。
而 b = 3+4 是正确的, 因为他是常量相加, 结果7在缓冲池中存在(-128~127), 所以可直接复制给byte类型的b。
常量相加,是先加,然后看结果在不在范围内,如果在就不会报错,超出范围就报错。 byte 范围是 (-128~127)。 7当然在,所以不会报错。

作者: 岁月如歌2013    时间: 2015-5-9 18:03
348532020 发表于 2015-5-9 17:52
我觉得2楼的答案更标准一点,我的想法和他一样。在他的答案的基础上我再修改一小部分。
b=b1+b2;   错误

非常标准的答案,又学到了,谢谢




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