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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李东梁 中级黑马   /  2014-4-11 10:44  /  794 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李东梁 于 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. }
复制代码

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

评分

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

查看全部评分

4 个回复

倒序浏览
byte x=2,y=3,z;
                 z=x+y;
我只是猜测:
JDK新特性,x+y自动拆箱,然后相加的结果自动装箱成int, 然后赋值给byte,所以会报错...

回复 使用道具 举报
本帖最后由 491138002 于 2014-4-11 11:03 编辑

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

z = (byte)(x+y)   这样强转就ok了
回复 使用道具 举报
首先,基本数据类型 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类型就没有问题了。
回复 使用道具 举报
原来是东梁兄啊~:lol
报错的原因是:因为x和y是变量,因为变量的值会变化,不确定具体的值,所以默认使用int类型进行存储。把int类型的值赋值给byte类型,肯定是会报错的~有木有道理啊~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马