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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊永标 中级黑马   /  2013-1-6 14:21  /  1275 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. byte a=10;
  2. byte b=2;
  3. byte c=a+b;//编译会发生错误

  4. short a=10;
  5. short b=2;
  6. short c=a+b//编译会发生错误

  7. int a=10;
  8. int b=10;
  9. int c=a+b;//编译通过
复制代码
请问这是为什么呢?

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
       这是因为系统默认的整数类型是int,而int的范围要比byte、short都大。举个例子:short c=a+b时,虚拟机先将a和b的值存到内存中,然后进行了一次加法运算,运算出来的结果被默认为int型数据。而一个int型数据要存储到short型的c中时,便出现了错误。
      想要编译通过的话,只需将上面程序中的byte c=a+b;和short c=a+b;改写成byte c=(byte)(a+b);和short c=(short)(a+b);将运算结果强制转换为和c相同的类型即可。

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
前两个都是报可能损失精度是吧,  这好办    这样   byte c = (byte) (a + b);   即可,因为整数默认是int 类型
回复 使用道具 举报
陈丽莉 发表于 2013-1-6 14:29
这是因为系统默认的整数类型是int,而int的范围要比byte、short都大。举个例子:short c=a+b时,虚 ...

美女,讲得不错哦,谢谢你
回复 使用道具 举报
本帖最后由 何竹冬 于 2013-1-6 17:34 编辑

你好
在网上查了一些资料发现:
在java中,对char, byte和short类型的字符串进行数学算法操作,比如+,-,>>位移操作,都会引发 自动类型提升结果将是int类型,a+b的结果是int, 要将int的值赋给byte就必须进行类型强制转换。
以下这句,是从think in java 3rd中摘出来的,希望对你有帮助。 In char, byte, and short, you can see the effect of promotion with the arithmetic operators. Each arithmetic operation on any of those types produces an int result, which must be explicitly cast back to the original type (a narrowing conversion that might lose information) to assign back to that type.
最后 关于类型的自动提升,java定义若干适用于表达式的类型提升规则:   
   
      第一,所有的byte型、short型和char型的值将被提升到int型;   
      第二,如果一个操作数是long型,计算结果就是long型;   
      第三,如果一个操作数是float型,计算结果就是float型;   
      第四,如果一个操作数是double型,计算结果就是double型。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马