黑马程序员技术交流社区
标题:
变量越界问题,赋值问题
[打印本页]
作者:
李东梁
时间:
2014-4-11 10:44
标题:
变量越界问题,赋值问题
本帖最后由 李东梁 于 2014-4-11 10:46 编辑
package cn.itcast.day02;
public class Demo {
public static void main(String[] args) {
byte x=2,y=3,z;
<font color="Red">z=x+y</font>; //为什么报错,这个按照老师讲的报错,下面的为什么又不报错呢?
int a=2,b=3,c;
c=a+b; //为什么不报错???
System.out.println(c);
}
}
复制代码
问题我注释在代码里面了,请详细解答,谢谢!
作者:
ノ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