黑马程序员技术交流社区

标题: 强制转换 [打印本页]

作者: vipzh    时间: 2012-12-2 17:29
标题: 强制转换
为什么short s1 = 1; s1 = s1 + 1不可以编译 short s1 = 1; s1 += 1;可以编译?
作者: xjandrew    时间: 2012-12-2 17:39
short占2个字节,int占4个字节,short型变量+上int型值计算结果是int型,占4个字节,然后付给一个short型变量s1,就要丢失2个字节的精度,这是不容许的。
作者: 赵学刚    时间: 2012-12-2 23:01
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),作了强制转换。
作者: 丁桂松    时间: 2012-12-2 23:15
byte short char在做运算时会先转换成int再做运算.short+=1由jvm做了隐形强转.因此可以通过编译.
作者: 何伟    时间: 2012-12-2 23:23
强转下就可以编译了
作者: 焦健    时间: 2012-12-6 20:10
short s1 = 1;  s1 = s1 + 1执行时需要进行类型转换,short s1 = 1; s1 += 1;不需要进行类型转换,可以直接编译
作者: 杨从强    时间: 2012-12-7 00:13
s1 = s1 + 1不可以编译;这是因为s1是short类型,但跟1(数字默认是int类型)相加其结果就是int了,因为short占二个字节(就是16位咯)而int占四个字节(就是32位了)为了不溢出(也就是所谓的损失精度)他们的和肯定是int类型。但是其结果却是赋给了为short类型的s1,这不就矛盾了么?(就相当于你喝水的水杯容量假设为1000ML,而你现在却要往里面倒2000ML的水。你想想有没得问题,可能装的下吗?)
至于s1 += 1为什么可以通过编译这个很简单。+=这个运算符就是将那个和强制给转换成了short的类型赋给了原来的s1(其实这是在内存中将原来s1的给取代了(覆盖了))所以就可以了。
  不知道兄台懂了没有,如果没有的话我真的想现在去洗个冷水澡给自己清醒清醒。
敝人也才自学没多久,祝你好运。




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