今天再次在卫琴的论坛上看到有人问这样的问题:
short tmp = 0;
为什么tmp = tmp +1;错误但 tmp ++;却正确.
用google和yahoo竟然搜索不到一个正确的答案.都说java程序员不需要关心底层,真的吗?
s+1中,+操作有两个操作数,JVM指令中+操作最小类型是int,其它的byte、short、char都以iload,iadd来操作,
然后用i2b,i2s,i2c来转换回去,因为+操作在两个数中间,所以如果不手动转换,编译器根本不知道你要
转换成第一个操作数类型还是第二个操作数类型.
s++中,相当于s上的increment操作,目的操作数是s,它的类型确定是short,所以在iadd后,编译器会自动
调用i2s将int转换为short.
你不要以为1默认是int,所以tmp+1默认以最大类型来运算.试一下下面的运算就知道了:
short a = 0;
short b = 0;
short c = a +b;两个short不存在以最大类型运算被转换为int运算了吧?
事实上它还是不行,因为short也只能用iload,iadd指令运算,所以short c = a+b也一定要手工转换.