25、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1; (s1+1运算结果
2013-01-30 20:45
543 查看
最近没事看了下Java的一些经典面试题,前面的都还挺简单,一路看下去毫无阻力,但是看到第25题就被难住了,第25题是这样的:
自己亲手在Eclipse敲了一下,答案确实是对的。但是为什么两者功能相同,但是编译器却不同对待呢?
没办法,只有查看下字节码的指令了。
首先是 测试 short s1 = 1; s1 += 1;
字节码:
请注意偏移量为5的那个操作码: i2s (即int to short)。
说明编译器在编译时自动添加了i2s操作码。而对于s1 = s1 + 1这种情况,由于没有自动添加 i2s 指令,所以必须显式进行类型转换。
除了short类型外,char和byte同样适用于以上情况。
另外需要注意一点的是对于char,byte,short基本类型的数据,在入栈之前都会被进行带符号化扩展(扩展到一个字长)。因此在操作数栈中不可能存在char,byte和short类型的数据。因为它们都被转换成int类型了。
下面在扩展几个基本知识。
int,long,float,double之间可以相互进行转换。比如int转换成long,相应的指令为i2l,数一数可以知道一共有12种指令。
int转换成char,byte,short的指令为i2c,i2b,i2s,首先会进行相应的截短处理,然后在带符号扩展压栈。
char,byte,short到int 的转换则没有相应的指令,理由很简单,因为它们本来就会被转换成int类型压栈。所以在代码中无需显示强制类型转换。
对于long,float,double转换成char,byte,short,没有相应的指令集。实现中是通过中转int转换的。比如long转换成byte l2i,i2b。
25、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型) short s1 = 1; s1 += 1;(可以正确编译)
自己亲手在Eclipse敲了一下,答案确实是对的。但是为什么两者功能相同,但是编译器却不同对待呢?
没办法,只有查看下字节码的指令了。
首先是 测试 short s1 = 1; s1 += 1;
字节码:
public void test(); flags: ACC_PUBLIC Code: stack=2, locals=2, args_size=1 0: iconst_1 1: istore_1 2: iload_1 3: iconst_1 4: iadd 5: i2s 6: istore_1 7: return LineNumberTable: line 8: 0 line 9: 2 line 10: 7
请注意偏移量为5的那个操作码: i2s (即int to short)。
说明编译器在编译时自动添加了i2s操作码。而对于s1 = s1 + 1这种情况,由于没有自动添加 i2s 指令,所以必须显式进行类型转换。
除了short类型外,char和byte同样适用于以上情况。
另外需要注意一点的是对于char,byte,short基本类型的数据,在入栈之前都会被进行带符号化扩展(扩展到一个字长)。因此在操作数栈中不可能存在char,byte和short类型的数据。因为它们都被转换成int类型了。
下面在扩展几个基本知识。
int,long,float,double之间可以相互进行转换。比如int转换成long,相应的指令为i2l,数一数可以知道一共有12种指令。
int转换成char,byte,short的指令为i2c,i2b,i2s,首先会进行相应的截短处理,然后在带符号扩展压栈。
char,byte,short到int 的转换则没有相应的指令,理由很简单,因为它们本来就会被转换成int类型压栈。所以在代码中无需显示强制类型转换。
对于long,float,double转换成char,byte,short,没有相应的指令集。实现中是通过中转int转换的。比如long转换成byte l2i,i2b。
相关文章推荐
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 对于short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- Java中short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- 11.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- 【Java面试题】57 short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
- 数据类型转换:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1=1,s2=1;short s3=s1+s2;
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
- 面试题:short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?