黑马程序员技术交流社区
标题:
绝对值得你一看的 神 奇 代 码 自动类型转换之
[打印本页]
作者:
贺靖轩
时间:
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