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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Leo_yeung 中级黑马   /  2013-9-25 21:39  /  1962 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Leo_yeung 于 2013-10-10 17:29 编辑

byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错
关于上面两个表达式怎么理解?
由于在java中,所有的整数默认都是int类型的,可不可以理解为:在运算时,b1,b2都要先转换为int类型,再赋值,所以将int型赋给byte型时报错?

点评

楼主,改成已解决吧  发表于 2013-10-7 16:02

评分

参与人数 1技术分 +1 收起 理由
潘才新 + 1

查看全部评分

8 个回复

倒序浏览
主要是精度问题,我运行的时候出现的提示信息是可能损失精度。需要加个强制类型转换,这样编译就没有问题了。byte表示的范围很小(-128~127),一般情况下很少使用数学运算,而是逻辑(| ^ ~)运算。不过拿来研究是可以的。
回复 使用道具 举报
byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错
在上面的两个表达式,其中b=3+4运算时没有类型转换的,因为常量计算是直接相加;而b=b1+b2 式子运算时,运算的结果是int型,然而把它赋给byte型的b一定是报错的,如果一定想这么做的话可以加上一个类型 强制转换b=(byte)(b1+b2),你在下面理解是对的,但是在java中不加类型时整数默认的类型是int型,小数(实数)默认的是double型
回复 使用道具 举报
放飞自己365 发表于 2013-9-25 23:07
byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错

我觉得这样理解还是有点问题的,第一,3和4是常量,默认是int类型的,b是byte类型的,b=3+4;编译时,java应该会检查这个结果是否会超出byte的范围,如果不会,OK,如果是b=3+125可定会报错;
第二,b=b1+b2;三个变量全部被定义为byte类型,java应该不会将b1+b2的结果转换为int型,而是因为b1,b2是变量,所以编译器无法检查b1+b2的结果是否会超出byte的范围,所以报错“可能会损失精度”,另外b=b1+4;也是一样的道理

第三,还有一种特殊的情况是+=,-=,*=,/=,%=在运算时,是不会报错的,即使超出byte的范围也不会报错,可能是java进行了隐式的强制类型转换,这里应该是向下转型,当b+=128时会输出负数,所以丢失精度了。
回复 使用道具 举报
byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错
b = 3 + 4 因为三四都为常量jvm在运算的时候会进行判断是否超过了byte的取值范围、如果没超过byte的取值范围java虚拟机就会直接进行运算然后再赋值给b、如果超出byte的取值范围会报错  错误: 可能损失精度
而b1和b2都属于变量、jvm无法判断变量的的值所以会直接报出损失精度
回复 使用道具 举报
小痞痞 发表于 2013-9-25 23:42
byte b,b1=3,b2=4;
b=3+4;//正确
b=b1+b2//编译报错

可能因为java中的所有整数默认都是int类型的,所以精度低于int的数据类型都会出现这样的情况,byte,short,char,好像精度比int高的数据类型就不会出现,如long,double
回复 使用道具 举报

byte b,b1=3,b2=4;
b=3+4;//正确  一步赋值,在底层进行了强转,由JVM完成
b=b1+b2//编译报错     b1和b2都是int,值超出范围,需强转
回复 使用道具 举报
王飚 中级黑马 2013-9-30 20:39:30
8#
/*
类型转换
*/

class  ClassDemo
{
        public static void main(String[] args)
        {
                byte b,b1=3,b2=4;
                System.out.println(b=(byte)(b1+b2));
        }
}
//这里运算时,b1+b2发生类型提升,所以,将它的结果转回byte就行了;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马