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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 江公亮 于 2013-3-20 10:54 编辑

    byte a=3,b=4,z;
    1、   z=3+4;//这样就不会报错了。
    2、   z= 3+560;//这样也会报错,也要求byte造型
    3、  z=a+b; //Eclipse 会提示我对a+b进行byte造型,也就是z=(byte) (a+b);

   通过在网上搜索,明白编译器在编译时,发现右边的类型是int类型,并且是常量,编译器就会判断,运算结果是否在byte
【-128 127】范围内,如果是,编译器会默认由int转化为byte,如果不在,就会要求我们造型。我认为这就是1、2的原因。

   对于3、,编译器发现右边的变量,不认确定它的值是否在byte的范围内,为了保险起见,编译器就要求我们显示造型。也就是要求在外面加上byte.

还有为什么,编译器会这样要求,那如果两个int相加,就不会超出int范围吗??

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 新人加油

查看全部评分

8 个回复

倒序浏览
  1、   z=3+4;//这样是向上类型转换,不需要强转
    2、   z= 3+560;//这样右边相加是int类型,而左边是byte类型 这是向下类型转换,需要强转
    3、  z=a+b; //这个也是类型转换的问题
总结:向上类型转换不用强转,但是向下类型转换必须强转

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报

  a和b是“变量”意味着这两值不确定、可能随时变化,编译器无法检查,也无法确定是否在byte字节范围之内, 他检查不了就会报错(可能丢失精度),如果是“常量”编译器就能够判断了
当两个数是常量时,再进行判断 常量是否在byte类型范围内   若在  就相加   若不在   就报错   因为可能会丢失精度
如你给定的题目
  z= 3+560;  后面那个560很明显超出了 byte的范围,应该是int类型  右边相加结果是int类型;而左边z是byte类型,若不进行转换 会丢失精度 编译器报错  



还有为什么,编译器会这样要求,那如果两个int相加,就不会超出int范围吗??
而两个int类型进行相加运算  java内部机制会默认int运算,一旦超出这个范围,他自动底层有强制转换过程,保留自己原有位置、高位全舍弃  这就是byte和int的区别,int属于默认类型,他就没有byte上面那样的问题


  byte和short类型“变量”,相加不能确定结果,无法检查,也不是默认类型,所以byte、short类型相加的时候,都会自动提升到int类型的

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
我手心里的宝 发表于 2013-3-20 10:32
1、   z=3+4;//这样是向上类型转换,不需要强转
    2、   z= 3+560;//这样右边相加是int类型,而左边是b ...

1,2 右边的都是int类型,都应该是向下转,重要的是第一个相加的结果在byte范围之类,而第二个不在!
回复 使用道具 举报
郝勇 发表于 2013-3-20 10:45
a和b是“变量”意味着这两值不确定、可能随时变化,编译器无法检查,也无法确定是否在byte字节范围之内 ...

额,也就是说,如果两个int类型相加或相减,超过int的范围,就保留低位
回复 使用道具 举报
你在定义的时候 byte a=3,b=4,z;
已经定义了abc的类型为byte
byte类型的范围为-128——127
3,4,都在这个范围内相加的7 也在byte范围内 所以没有转换 刚才说的有点错(如果值在byte 范围内不需要转换,)
但是过了127就是为int 了 所以需要强转
回复 使用道具 举报
我手心里的宝 发表于 2013-3-20 10:54
你在定义的时候 byte a=3,b=4,z;
已经定义了abc的类型为byte
byte类型的范围为-128——127

:),嗯,确实,超出了会默认转化,
回复 使用道具 举报
郝勇 中级黑马 2013-3-20 11:08:27
8#
江公亮 发表于 2013-3-20 10:52
额,也就是说,如果两个int类型相加或相减,超过int的范围,就保留低位

恩   这是java开发人员 设定的吧  具体我感觉   把有些东西死记住就行!  敲的多了  可能就会明白了!
回复 使用道具 举报
嗯,谢了,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马