黑马程序员技术交流社区

标题: 绝对值得你一看的 神 奇 代 码 自动类型转换之 [打印本页]

作者: 贺靖轩    时间: 2013-3-29 16:21
标题: 绝对值得你一看的 神 奇 代 码 自动类型转换之
本帖最后由 贺靖轩 于 2013-3-29 16:26 编辑

恩 我又发现个有意思的现象.

                                          System.out.println(Short.MAX_VALUE);   // 输出结果为32767

                                          short s=1;   //稀松平常的初始化

                                          s=s+32766;  //大家猜会发生什么 ?

                                         没错,吸取了经验之后,32767做为一个整型 与 s 进行进行运算后 会将类型自动提升为整型,
                                         所以会报类型不匹配错误 :Type mismatch: cannot convert int from short

                                         但是
                                                                                         这是一段神奇的代码
                                        !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                                                                                           s+=32766;  //IDE环境未提示任何错误

                                                                                           System.out.println(s);  //也输出了32767这样的结果


                                       !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                                       



求解释。



作者: HM马明宇    时间: 2013-3-29 16:42
亲,这并没有什么神奇的,+=是一个复合赋值符号,这个符号进行赋值时不会提升运算数据的类型,而是智将结果赋给变量,这是规定。
所以s=s+1;与s+=1;是不一样的。
但是应用此符号是有危险的,short类型的变量的最大值是32767,若你定义short s=32767;
然后s+=1的话,结果会变成-32768;这是因为数据在内存中使用二进制表现形式引起的。
详细可参见以下博客:
http://blog.csdn.net/qinglu/article/details/3071809
作者: 熊永标    时间: 2013-3-29 16:58
  s=s+32766//这一句发生错误,编译无法通过,因为32766一个int类型,当和一个short进行运算时,short会自动提升为int类型,然后再做运算,最后计算结果为int类型,然后赋值给s时,因为s是一个short类型的变量,不能把一个int类型的数据赋值给一类型为short的变量,所以没法通过编译器的检察.之所以不能把一个int类型的值赋给一个short类型的变量,是因为int占四个字节,也是就32个二进制位,而short只占两个字节,16个二进制位,它们所占的二进制位不相同,这种赋值就有可能产生值的错误.所以才不能赋值.就好比说你用一个能装一升水的容器,去装两升水,结果就不是两升水了.
      s+=32766//为这种只有一次的运算,编译器不进行类型检察,然后就通过编译了,当在运行时,才确定这个值是否超出short范围,如果超出,则结果值错误.否则运行正常,上面的结果值最好能容得下,所以就正常了,如果你把s的值改为2试试,结果就为:-32768,看看结果,是一个负数,值已经发生错误了.
作者: 刘胜寒    时间: 2013-3-29 17:52
哥们,short类型多少位?十六位!你把那个位运算搞懂了,你就不觉的神奇了?说不定还能像二楼一样,给你广大师妹师弟讲解一下呢?捞分走人




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2