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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 ankje 于 2015-3-10 23:43 编辑

    编译以下代码时会报错,如果将行 3 的 byte 改成 short 同样会报错,而改成 int 或 long 则 编译通过。我的理解为:java会将两变量的加法运算的和转换成int类型,int再向byte或short转换自然会报错。但事实上到底是不是这个原因呢?各位大虾,你们有不同的理解么?
  1. class Test{
  2.     public static void main(String[] args){
  3.         byte a=3,b=4,c=5;
  4.         a=b+c;//报错
  5.         System.out.println(a);
  6.     }
  7. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1

查看全部评分

22 个回复

倒序浏览
是这样:你随便写个整数,它默认的就是int. 那题中的3,4,5都是int型。

所以, byte a=3,b=4,c=5;这句话就是错的,怎么能把int装到byte中去呢?装不下。short是一样的道理。
当定义成int时,自然ok的,用int来装int数据很合适。
当定义成long时,太爽了,随便装,怎么都能装下。

评分

参与人数 1黑马币 +2 收起 理由
万合天宜 + 2 很给力!

查看全部评分

回复 使用道具 举报
第四行写错了,应该改成a=(byte)(b+c);这是转换的问题
回复 使用道具 举报
1楼说出了出错的本质
回复 使用道具 举报
sofeel 发表于 2015-3-4 23:15
是这样:你随便写个整数,它默认的就是int. 那题中的3,4,5都是int型。

所以, byte a=3,b=4,c=5;这句话 ...

但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直接赋给byte变量的啊。
回复 使用道具 举报
李忠兵 发表于 2015-3-5 02:34
但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直 ...

byte在初始化的时候会自动强转的,
byte b=4; 是可以的
赋值不会强转的
byte b;
b=4;
你这样写肯定会错的

评分

参与人数 1黑马币 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
huangchunwei 来自手机 中级黑马 2015-3-5 08:00:24
7#
初始化a,b,c没有错误。再去对a,b,c进行算数运算就会牵涉到自动装箱的问题。既b+c会自动提升为int类型,这样你在赋值给a(a是byte类型),所以这里会报错,只要强转一下就OK了。

评分

参与人数 1黑马币 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
我在加一点、强制转换是【高精度转低精度】才使用的(高--->低:long  int   short  byte ,(浮点型)double  float)
自动转换、是低精度转换为高精度  ,自动类型提升

评分

参与人数 1黑马币 +1 收起 理由
万合天宜 + 1 赞一个!

查看全部评分

回复 使用道具 举报
李忠兵 发表于 2015-3-5 02:34
但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直 ...

http://bbs.itheima.com/thread-127149-1-1.html
回复 使用道具 举报
z47057554 发表于 2015-3-5 03:11
byte在初始化的时候会自动强转的,
byte b=4; 是可以的
赋值不会强转的

经过测试,
byte b;
b=4;
并没有提示错误。
回复 使用道具 举报
硫氢化铁 发表于 2015-3-4 23:19
第四行写错了,应该改成a=(byte)(b+c);这是转换的问题

是的,正如我所理解,java会把它变为 a=(int)(a+c) ,若按你所说的对做就不会报错了
回复 使用道具 举报
ankje 发表于 2015-3-5 21:58
是的,正如我所理解,java会把它变为 a=(int)(a+c) ,若按你所说的对做就不会报错了 ...

嗯,理解就好
回复 使用道具 举报
1.第一句话是对的。 照1楼那样说就没办法定义byte型变量了。
2.基本数据类变量进行运算时,会先将byte,short,char型变量默认提升为int类型,
a = b+c;其中b+c运算出来的结果时int型,所以会报错。

评分

参与人数 1黑马币 +2 收起 理由
万合天宜 + 2 很给力!

查看全部评分

回复 使用道具 举报
ankje 发表于 2015-3-5 21:55
经过测试,
byte b;
b=4;

确实是这样,b=-128~127是不会报错的,这个跟自动装箱的享元设计模式类似
回复 使用道具 举报
qq10763582 来自手机 中级黑马 2015-3-6 07:07:50
15#
好多大事神
回复 使用道具 举报
来学习一下。
回复 使用道具 举报
综合学习了。
回复 使用道具 举报
李忠兵 发表于 2015-3-5 02:34
但是byte a=3,b=4,c=5;这句编译可以通过的啊,为什么说它是错的。。。
将一个在byte范围内的常量是可以直 ...

因为你这里写b和c是变量,若是a=3+4则不会出错,因为此时后面的结果是常量
回复 使用道具 举报
这个问题基础教程里就有啊~~
回复 使用道具 举报
你觉得byte 型数据的占1个8位2进制,3是一个整数占4个8位二进制,你拿1俩的碗装4俩的饭能装下吗。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马