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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 公子-醉香 中级黑马   /  2013-12-18 10:21  /  1557 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

byte b = 1 + 1;   
进行运算的时候,会将b的类型提升为int类型,从而导致可能损失精度的问题
byte b = 1; b = b + 1;
b=b+1 在运算的时候也是不是会把b的类型自动提升为int类型呢?这个点一直不是很明白,帮忙详细的解答一下。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

倒序浏览
byte b = 1 + 1;   这个可以执行通过 因为1是常量 也是在byte类型范围的
byte b = 1; b = b + 1;其中 b是个变量,1 系统默认的是int类型,会自动把b强转成int类型 所以会运行不同过,如果把这个公式写成byte b = 1;b=+1;就可以通过了。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
byte b = 1+1;
这个是可以通过的,首先类型已经定义为了byte;而后面的运算没有变量参与,都是常量参与;
那么他们的运算只考虑在不在byte的范围内,比如你写成byte b =127+1;这个就会超出范围;
byte b = 1; b = b + 1;(可能你疑惑的是已经定义了b是byte类型为什么还变为int类型)
在java中,对char, byte和short类型的字符串进行数学算法操作,比如+,-,>>位移操作,都会引发
自动类型提升,结果将是int类型, b + 1的结果就是int, 要将int的值赋给byte就必须进行类型强制转换。

最后 关于类型的自动提升,java定义若干适用于表达式的类型提升规则:   
   
      第一,所有的byte型、short型和char型的值将被提升到int型;   
      第二,如果一个操作数是long型,计算结果就是long型;   
      第三,如果一个操作数是float型,计算结果就是float型;   
      第四,如果一个操作数是double型,计算结果就是double型。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
int就像是一个分界点似的,int以下的类型的运算时,都是先做类型转换,即转换成int进行计算,得到结果在进行下一步的类型转换,你算说的byte b=1; b=b+1;
1是int类型,b变量会先做类型转化,变成int进行计算,得到结果是int,因为又赋值给b,是byte,就再进行强制转换为byte,当然,这一步转换就要考虑到上面的同学所说的溢出问题,要注意byte的范围了,如果超出范围就会造成溢出了

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
Java中涉及byte、short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。因此,如果把存在byte类型值相加,最后会得到一个int类型的结果。如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
1)自动类型提升
     byte b=3;
     int x=4;
     x=x+b; //b会自动提升为int型进行运算
  2)强制类型转换
     byte b=3;
     b=b+4;//会报错
     正确写法为:b=(byte)b+4;
4.思考
  byte a=1+1;//正确   定义byte型的变量a时,会自动将右边的数值自动完成了强转
  byte b = 1; b = b + 1;   //编译失败,错误。这是数据类型转换,b是byte型,1默认是int型,运算结果是int型,赋值给byte型的b变量可能损失精度。
  byte c = 1; c = c += 1;  //正确。首先,c+=1中+=运算符在给c赋值时,自动完成了强转操作。最后将运算后的c赋值给c。
  byte d = 1; d = ++d;    //正确。首先,先运算++d,该运算是先将d加一后的结果赋值给d,在赋值过程自动完成了强转操作。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马