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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张天昊76 中级黑马   /  2013-11-17 21:31  /  2532 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张天昊76 于 2013-11-18 23:21 编辑

1、在两个相同的低类型(byteshort)变量相加时,结果类型自动提升为int。问题是,这两个变量做运算时先类型提升为int后再相加,还是先相加,把得到的结果类型自动提升为int了。例如:
  1. byte a=66,b=90;

  2. System.out.println(a+b); //结果是156

  3. System.out.println((int)(a+b)); //结果是-100
复制代码


评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很有趣~

查看全部评分

7 个回复

倒序浏览
这两个变量做运算时先类型提升为int后再相加,下面有个小例子供加深理解;

short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。

short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。

回复 使用道具 举报
先提升为int,在进行相加。我们下看下边代码:
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 byte a=1,b=1;
  6.                
  7.                 byte c =a+b;
  8.                 System.out.println(c);
  9.         }
  10. }
复制代码
编译时就会提示损失精度,需要byte,找到int。
如果是先相加得到结果再提升,此时a+b=2,没有超出byte类型,按理说不应该自动提升数据类型了,但是结果还是提升了。
由此可见,先相加得到结果再提升数据类型 不成立。

另外,提一点,楼主代码中,System.out.println((int)(a+b));结果之所以是-100,是因为楼主采用的是中问字符的括号,因此编译时提示异常,并显示-100,正常情况下,结果仍然是156.
只有在把这个结果强转回byte型时,才会得出-100.
原因是,计算结果是计算结果是int型,是32位,而byte最高只有8位,8为存储的正数最高是127(0111 111),因此存储不下计算结果。
强制转换时会把int型156(0000 0000 0000 0000 0000 0000 1001 1100)的前24位全部忽略掉,变为1001 1100,对应十进制-100.
回复 使用道具 举报
付凯鹏 发表于 2013-11-17 22:45
这两个变量做运算时先类型提升为int后再相加,下面有个小例子供加深理解;

short s1 = 1; s1 = s1 + 1;由于 ...

结果是int型我知道,问题关键是这两个变量时先类型提升后再做的运算呢,还是运算完了再类型提升的呢?
回复 使用道具 举报
天ya~_琼楼 发表于 2013-11-17 22:45
先提升为int,在进行相加。我们下看下边代码:编译时就会提示损失精度,需要byte,找到int。
如果是先相加 ...

你说每超出byte类型范围,按理说不应该提升数据类型。这是为啥呢?不过我也想明白了,如果说是先相加在提升的话,那就是说这个值提升前前是byte的156(这显然不可能),就像定义变量byte b = 156,就没法通过编译。还是很谢谢你啦!很耐心的解答了后面的。
回复 使用道具 举报
#在这里快速回复#谢谢楼主期望灌水,我是来拿技术分 Sun Feb 23 17:54:25 CST 2014
回复 使用道具 举报
#在这里快速回复#谢谢楼主期望灌水,我是来拿技术分 Sun Feb 23 20:29:16 CST 2014
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马