黑马程序员技术交流社区

标题: 变量越界问题,赋值问题 [打印本页]

作者: 李东梁    时间: 2014-4-11 10:44
标题: 变量越界问题,赋值问题
本帖最后由 李东梁 于 2014-4-11 10:46 编辑
  1. package cn.itcast.day02;

  2. public class Demo {
  3.         public static void main(String[] args) {
  4.                
  5.                 byte x=2,y=3,z;
  6.                
  7.                 <font color="Red">z=x+y</font>;   //为什么报错,这个按照老师讲的报错,下面的为什么又不报错呢?
  8.                
  9.                
  10.                 int a=2,b=3,c;
  11.                
  12.                 c=a+b;  //为什么不报错???
  13.                
  14.                 System.out.println(c);
  15.         }
  16. }
复制代码

问题我注释在代码里面了,请详细解答,谢谢!

作者: ノtrack    时间: 2014-4-11 10:55
byte x=2,y=3,z;
                 z=x+y;
我只是猜测:
JDK新特性,x+y自动拆箱,然后相加的结果自动装箱成int, 然后赋值给byte,所以会报错...


作者: 491138002    时间: 2014-4-11 11:02
本帖最后由 491138002 于 2014-4-11 11:03 编辑

两个byte类型相加会先自动转换为int然后相加,当然相加的结果也是int型的,但是你要将一个int型的数字赋给一个byte型的显然是要强制转换的,因此Java会报编译错误

z = (byte)(x+y)   这样强转就ok了

作者: 歌癫    时间: 2014-4-11 12:24
首先,基本数据类型 byte 和 int 的取值范围不同;byte 的取值范围是 -128~127 ,int 的取值范围是  -2[sup]31[/sup]~2[sup]31[/sup]-1
byte x = 2,y=3,z;
z=x+y;  
这里x和y都是变量, 编译器(JVM)在编译时(byte类型取值是有限的),它在判断右边的表达式是两个变量, 意味着这两值不确定、可能随时变化,编译器无法检查,也无法确定是否在byte字节范围之内, 它检查不了就会报错(可能丢失精度);

int a=2,b=3,c;
c=a+b;  //为什么不报错???
在整型中,int是默认的类型,默认int运算,所以不会报错。

在两个数进行运算的过程中,一旦结果超出这个范围,jvm底层自动有强制转换过程,保留自己原有位置、高位全舍弃。  这就是byte和int的区别,int属于默认类型,它就没有byte上面那样的问题。
上面 z = (byte)(x+y);将结果强制为byte类型,在赋值给byte类型就没有问题了。

作者: 王春蕾    时间: 2014-4-11 16:20
原来是东梁兄啊~:lol
报错的原因是:因为x和y是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。把int类型的值赋值给byte类型,肯定是会报错的~有木有道理啊~





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