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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© vipzh 中级黑马   /  2012-12-2 17:29  /  1181 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么short s1 = 1; s1 = s1 + 1不可以编译 short s1 = 1; s1 += 1;可以编译?

6 个回复

倒序浏览
short占2个字节,int占4个字节,short型变量+上int型值计算结果是int型,占4个字节,然后付给一个short型变量s1,就要丢失2个字节的精度,这是不容许的。
回复 使用道具 举报
short s1 = 1; s1 = s1 + 1不可以编译 short s1 = 1; s1 += 1;可以编译
因为:进行s1+1运算时s1自动提升为int 类型,最后的和也是int 类型,把一个int 类型的值赋给一个short类型的值,由于int 在内存中站四个字节 short占两个字节,这些赋值就
相当于把一个脸盆往一个小碗里装 ,是不可能装下的,后面编译通过是因为s+=1相当于s1=(short)(s1+1),作了强制转换。
回复 使用道具 举报
byte short char在做运算时会先转换成int再做运算.short+=1由jvm做了隐形强转.因此可以通过编译.
回复 使用道具 举报
强转下就可以编译了
回复 使用道具 举报
short s1 = 1;  s1 = s1 + 1执行时需要进行类型转换,short s1 = 1; s1 += 1;不需要进行类型转换,可以直接编译
回复 使用道具 举报
s1 = s1 + 1不可以编译;这是因为s1是short类型,但跟1(数字默认是int类型)相加其结果就是int了,因为short占二个字节(就是16位咯)而int占四个字节(就是32位了)为了不溢出(也就是所谓的损失精度)他们的和肯定是int类型。但是其结果却是赋给了为short类型的s1,这不就矛盾了么?(就相当于你喝水的水杯容量假设为1000ML,而你现在却要往里面倒2000ML的水。你想想有没得问题,可能装的下吗?)
至于s1 += 1为什么可以通过编译这个很简单。+=这个运算符就是将那个和强制给转换成了short的类型赋给了原来的s1(其实这是在内存中将原来s1的给取代了(覆盖了))所以就可以了。
  不知道兄台懂了没有,如果没有的话我真的想现在去洗个冷水澡给自己清醒清醒。
敝人也才自学没多久,祝你好运。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马