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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Imp_x 高级黑马   /  2014-7-23 09:35  /  2815 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Test
{
        public static void main(String[] args)
        {
                byte b=1,c=2;
                byte a=b+c;   //这句话为何会提示损失精度??难道b、c相加会先自动变为int类型??可是a、b、c不都是byte类型吗?等号两边类型一样应该不会自动转换类型吧??
                System.out.println("a="+a);
        }
}

20 个回复

倒序浏览
就和你说的,虽然吧b,c声明是byte型,但是(b+c )在内部默认就是int型,赋值给byte型,当然损失精度。。需要强转。
回复 使用道具 举报
DarkSky 发表于 2014-7-23 09:54
就和你说的,虽然吧b,c声明是byte型,但是(b+c )在内部默认就是int型,赋值给byte型,当然损失精度。。 ...

那不是每次把b+c的值赋给a都需要这样byte a=(byte)(b+c);
如果这样的话,声不声明b、c是byte型都无所谓了吧...那声明b、c不是多余了....
回复 使用道具 举报
a+b会自动转换成Int型,所以应该是(byte)(a+b),java中有个晋升现象,低于Int的 byte short char运算相加时会自动提升为Int型,所以高转低应该强制转换。
回复 使用道具 举报
这里存在一种情况来着啊:
byte b=127,c=10;
byte a = b + c;

如果加法运算不是int类型的,这不就已经损失精度了么?所以四则运算都是int类型的。
所以 必需:
byte a = (byte)(b+c); //因为b+c太大了,超过了byte的上限了,所以最后会变成负数……
回复 使用道具 举报
Imp_x 发表于 2014-7-23 10:00
那不是每次把b+c的值赋给a都需要这样byte a=(byte)(b+c);
如果这样的话,声不声明b、c是byte型都无所谓了 ...

这个嘛,你要用b+c的和已经赋值给a了,以后想再赋值给其他变量直接拿a来用就好了。你要真要每次都算b+c
那就定义个方法,每次调用这个方法就行了。
回复 使用道具 举报
OCTSJimmy 发表于 2014-7-23 10:06
这里存在一种情况来着啊:
byte b=127,c=10;
byte a = b + c;

比较赞同这一个:lol
回复 使用道具 举报
网上搜到的问题解答 希望对你有帮助

byte b=4;
byte b1=3;
byte b2=7;
b=b1+b2;      //这样是计算不出b,是错误的
b=b1+7;        //这样也是计算不出b
byte b=3+7;  //怎么这样又可以计算?

求解啊。。
非常感谢大家的回答,以下有了详细的介绍,希望有跟我一样不理解的也能看到:

//b = 3+7;
  /*
  b取值范围:-128~127
  编译器在编译时(byte类型取值是有限的)他在判断右边的数值的时候发现是int类型(是“常量”), 但他会判断是不是在byte字节范围之内,如果在的话,会给右边的int类型做默认的强转,他把最后的一个字节(byte八个二进制)赋值到了b这个变量当中
  */

/*
  b1和b2是“变量”意味着这两值不确定、可能随时变化,编译器无法检查,也无法确定是否在byte字节范围之内, 他检查不了就会报错(可能丢失精度),如果是“常量”编译器就能够判断了

  int x;
  int x1=Integer.MAX_VALUE;
  int x2=2;
  x=x1+x2;
  默认int运算,一旦超出这个范围,他自动底层有强制转换过程,保留自己原有位置、高位全舍弃  这就是byte和int的区别,int属于默认类型,他就没有byte上面那样的问题
  */
  
  //byte和short类型“变量”,相加不能确定结果,无法检查,也不是默认类型,所以byte、short类型相加的时候,都会自动提升到int类型的
回复 使用道具 举报
在计算中,byte,short,char都会自动转换成int.这个老师讲过的。把一个int型的值赋给byte变量,的确会损失精度。大概就是这样。。
回复 使用道具 举报
Imp_x 高级黑马 2014-7-24 20:30:55
10#
space2007 发表于 2014-7-23 11:13
网上搜到的问题解答 希望对你有帮助

byte b=4;

好的 谢谢!!
回复 使用道具 举报
java脑残的设计,你就接受了吧
回复 使用道具 举报 1 0
你说对了,计算b+c时,b和c会先被提升为int,因此b+c的类型是int。而当赋值=右边不是常量表达式时,是不会自动向下强转的,因此=左右类型不匹配,报错
回复 使用道具 举报
默认类型是int 在进行算术运算的时候 会强制转换为int
回复 使用道具 举报
b和c都是变量,当a=b+c时,因为b+c值大小不确定,为避免丢失精度,会自动把b+c的和转为int类型,所以会提示丢失精度
回复 使用道具 举报
你说对了,byte类型数值相加,会自动转换为int类型,int类型复制给byte类型就会造成损失精度了
回复 使用道具 举报
童鞋们,不带这样儿的。

咳咳!

问题出在打印语句上。System.out是PrintStream型,println是它的方法,这个方法的重载形式中,根本没有byte型的参数,byte型写入后,会被认为是int型。

赋值语句没错……
回复 使用道具 举报
OCTSJimmy 发表于 2014-7-23 10:06
这里存在一种情况来着啊:
byte b=127,c=10;
byte a = b + c;

这个给力
回复 使用道具 举报
space2007 发表于 2014-7-23 11:13
网上搜到的问题解答 希望对你有帮助

byte b=4;

这个就水了你那个
  1. b=b1+7;
复制代码

7就是int 类型的啊
回复 使用道具 举报
刘一阳 发表于 2014-7-24 21:53
默认类型是int 在进行算术运算的时候 会强制转换为int

我是不是可以认为在java中的所有运算都是在不低于int类型下运算?
回复 使用道具 举报
感谢楼主,学习了
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马