日期:2014-05-20  浏览次数:20710 次

java语言中对类型是不是有额外信息标记的
从最底层的内存数据模型来讲
short和char在java中都是16位,至于是signed还是unsigned是和类型绑定了的

一直不太清楚类型信息是在什么层面,是在语言层面对数据起约束作用的吧?也就是编译时。
到具体jvm运行时,这些信息可能都被提升为int参与运算,至此其类型信息丢失

那比如short数值和其类型是如何绑定的呢,这些信息存储在何处?

------解决方案--------------------
好问题,突然觉得好高深!
不懂,帮顶!
求大牛解决
------解决方案--------------------
底层都是二进制位,只是将其解释成字符、整数、浮点数等的问题
------解决方案--------------------
引用:
引用:Java虚拟机支持Java语言的基本数据类型如下:
byte://1字节有符号整数的补码
short://2字节有符号整数的补码
int://4字节有符号整数的补码
long://8字节有符号整数的补码
float://4字节IEEE754单精度浮点数
double://8字节IEEE754双精度浮点数
char:……


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个类型的指令


------解决方案--------------------
引用:
引用:引用:引用:@ZangXT   一块内存到底是什么类型,取决你读取和解释的方式。


解释方式对的,但太笼统了,知道肯定知道的

比如两个数据

a = 1111 1111 1111 1111
b = 1111 1111 1111 111……

不是说编译时进行转换,而是说编译会根据数据类型生成相应的指令。举个例子:
	    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上的指令说明。