黑马程序员技术交流社区

标题: 类型自动提升的问题 [打印本页]

作者: 公子-醉香    时间: 2013-12-18 10:21
标题: 类型自动提升的问题
byte b = 1 + 1;   
进行运算的时候,会将b的类型提升为int类型,从而导致可能损失精度的问题
byte b = 1; b = b + 1;
b=b+1 在运算的时候也是不是会把b的类型自动提升为int类型呢?这个点一直不是很明白,帮忙详细的解答一下。


作者: zzkang0206    时间: 2013-12-18 10:33
byte b = 1 + 1;   这个可以执行通过 因为1是常量 也是在byte类型范围的
byte b = 1; b = b + 1;其中 b是个变量,1 系统默认的是int类型,会自动把b强转成int类型 所以会运行不同过,如果把这个公式写成byte b = 1;b=+1;就可以通过了。


作者: belief丶Only    时间: 2013-12-18 10:57
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型。
作者: 刘松703    时间: 2013-12-18 11:17
int就像是一个分界点似的,int以下的类型的运算时,都是先做类型转换,即转换成int进行计算,得到结果在进行下一步的类型转换,你算说的byte b=1; b=b+1;
1是int类型,b变量会先做类型转化,变成int进行计算,得到结果是int,因为又赋值给b,是byte,就再进行强制转换为byte,当然,这一步转换就要考虑到上面的同学所说的溢出问题,要注意byte的范围了,如果超出范围就会造成溢出了
作者: 恨死我了    时间: 2013-12-18 11:39
Java中涉及byte、short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果。因此,如果把存在byte类型值相加,最后会得到一个int类型的结果。如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型。
作者: 冯国强    时间: 2013-12-18 12:31
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,在赋值过程自动完成了强转操作。




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