从最底层的内存数据模型来讲
short和char在java中都是16位,至于是signed还是unsigned是和类型绑定了的
一直不太清楚类型信息是在什么层面,是在语言层面对数据起约束作用的吧?也就是编译时。
到具体jvm运行时,这些信息可能都被提升为int参与运算,至此其类型信息丢失
那比如short数值和其类型是如何绑定的呢,这些信息存储在何处?
------解决方案--------------------
好问题,突然觉得好高深!
不懂,帮顶!
求大牛解决
------解决方案--------------------
底层都是二进制位,只是将其解释成字符、整数、浮点数等的问题
------解决方案--------------------
java中所有长度小于int的类型,都会被提升为int来操作
比如
short a = 1;
short b = 1;
short c = a + b;//编译错误,如果有类型信息,编译器不会不知道2个short相加应该还是short,所以类型信息在入栈的时候已经丢了
字节码中 a,b都是bipush入栈的。所以最后a+b是用iadd指令来完成,得出的结果自然就是int型的无法通过编译了,而且java虚拟机指令中整数运算只有int和long2个类型的指令
------解决方案--------------------
不是说编译时进行转换,而是说编译会根据数据类型生成相应的指令。举个例子:
char a = 0x8000; // 1000 0000 0000 0000
short s = (short)0x8000; // 1000 0000 0000 0000
int i1 = a;
int i2 = s;
看其字节码:
0: ldc #2 // int 32768
2: istore_1
3: sipush -32768
6: istore_2
7: iload_1
8: istore_3
9: iload_2
10: istore 4
12: return
32768直接当作int处理了。
sipush指令则会进行sign-extended,具体参考jvms上的指令说明。