黑马程序员技术交流社区

标题: byte的疑惑 [打印本页]

作者: liguangcaiup    时间: 2013-7-19 16:29
标题: byte的疑惑
本帖最后由 liguangcaiup 于 2013-7-20 21:17 编辑

byte b = 100; b = b + 1; 报错         
byte b = 100; b += 1;  、// 为什么不报错                       
byte b = 1; b = ++b;    为什么对





作者: 王靖远    时间: 2013-7-19 16:37
第一个报错是因为 b+1经过运算被提升为了int型了,int型赋值给byte型的b就出错了。
第二个+=是有一个自动的强制转换过程,将int转回了byte就相当于 b = (byte)(b+1)
第三个不太清楚。想来也是和第二个同样的道理,有一个自动强制转换过程
作者: xscn    时间: 2013-7-19 16:44
毕姥爷视频里的例子
short s = 3;

s=s+2;

s+=2;
有什么区别?

s=s+2编译失败。这是两次运算,s被提升为int型,运算结果为int型,无法赋给short类型;

s+=2编译通过,这是一次运算,+=运算符在给s赋值时,自动完成了强制转换操作。
s=++s同理
作者: 闲人忙啊    时间: 2013-7-19 16:53
本帖最后由 闲人忙啊 于 2013-7-19 17:37 编辑

b+=1是b=b+1的简化,但在JVM运行语句b+=1时,会自动加强制类型转换,强转为byte型,即b=(byte)(b+1);
而JVM运行语句b=b+1时没有该动作,b+1的结果会自动转为int型,并赋值给byte型的b,所以系统会报错
作者: liguangcaiup    时间: 2013-7-19 19:26
闲人忙啊 发表于 2013-7-19 16:53
b+=1是b=b+1的简化,但在JVM运行语句b+=1时,会自动加强制类型转换,强转为byte型,即b=(byte)(b+1);
而JVM运行 ...

++b 呢?
作者: 刘张朋    时间: 2013-7-19 19:27
b. byte b = 1; b = b + 1;
   错误,因为b为byte类型的变量,其值可能会在byte类型的范围内变化,虚拟机不能进行判断再加上1后是否会溢出。

  
c. byte b = 1; b = b += 1;   
   正确,因为虚拟机会先运行b+=1的结果得到b的值,然后再将得到的b的值再次赋值给b,
   注:b+=1能正常运算,因为会将b+1的结果自动强转为byte类型后赋值给b。
           但是假如运行byte b=127;b = b += 1;则得到的运行结果不是我们希望的128,而是-128.

  
d. byte b = 1; b = ++b;  
   正确,原因同c。先计算++b的值强转为byte类型后得到b的值,
   然后再将得到的b的值再次赋值给b。但是假如运行byte b=127;b = b += 1;则得到的运行结果不是我们希望的128,而是-128.

作者: 闲人忙啊    时间: 2013-7-19 19:47
liguangcaiup 发表于 2013-7-19 19:26
++b 呢?

++b其实和b+=1一样,即b=(byte)(b+1)
作者: 云游天下    时间: 2013-7-19 23:55
b+1经过运算被提升为了int型了,int型赋值给byte型的b就出错了。
+=必须有计算结果输出的,所以jvm有一个自动的强制转换过程,将int转回了byte就相当于 b = (byte)(b+1)
++b其实和b+=1一样,也是必须有计算结果输出的,而且计算结果经jvm判断在byte范围内,所以也正确




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