java语言中对类型是不是有额外信息标记的

dracularking 2013-04-03 07:36:21
从最底层的内存数据模型来讲
short和char在java中都是16位,至于是signed还是unsigned是和类型绑定了的

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

那比如short数值和其类型是如何绑定的呢,这些信息存储在何处?
...全文
359 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2013-04-08
  • 打赏
  • 举报
回复
上面说的还是有点问题,jvm操作字节码,说明jvm还是要接触类型信息的,但从上面的字节码看,各种类型信息的数据最终都转化成了int,但上面没有运算步骤,如果有运算步骤的话可能更能突出一些问题,jvm需要int数据的原因。
dracularking 2013-04-08
  • 打赏
  • 举报
回复
新相关问题链接,在这里做一个传送门 http://bbs.csdn.net/topics/390417841
dracularking 2013-04-07
  • 打赏
  • 举报
回复
引用 21 楼 ZangXT 的回复:
引用 20 楼 dracularking 的回复:引用 18 楼 ZangXT 的回复:引用 17 楼 dracularking 的回复:引用 16 楼 x19881216 的回复:@ZangXT 一块内存到底是什么类型,取决你读取和解释的方式。 解释方式对的,但太笼统了,知道肯定知道的 比如两个数据 a = 1111 1111 1111 111……
哦基本明白了,非常感谢回复,是在编译时针对类型信息进行操作(存储的类型信息转存在对应的命令中了),运行时类型信息丢失
小绵羊 2013-04-06
  • 打赏
  • 举报
回复
引用 18 楼 ZangXT 的回复:
引用 17 楼 dracularking 的回复:引用 16 楼 x19881216 的回复:@ZangXT 一块内存到底是什么类型,取决你读取和解释的方式。 解释方式对的,但太笼统了,知道肯定知道的 比如两个数据 a = 1111 1111 1111 1111 b = 1111 1111 1111 1111 a和b类型是如何在运行时与它……
字节码其实已经很清楚了
ZangXT 2013-04-06
  • 打赏
  • 举报
回复
引用 17 楼 dracularking 的回复:
引用 16 楼 x19881216 的回复:@ZangXT 一块内存到底是什么类型,取决你读取和解释的方式。 解释方式对的,但太笼统了,知道肯定知道的 比如两个数据 a = 1111 1111 1111 1111 b = 1111 1111 1111 1111 a和b类型是如何在运行时与它们的数据各自关联的呢,short还是char仅凭数……
作为基本类型,运行时不需要根数据类型关联,不过是一块内存,类型是给编译器和人看的。 看个简单的例子,
public class Test {
    public static void main(String[] args){
		int i = 1;
		short s = 2;
		char c = 3;
	}
}
这三个变量在栈里其实都栈一个int大小。反编译之后用jad处理一下,得到的代码是:
        boolean flag = true;
        byte byte0 = 2;
        byte byte1 = 3;
没能准确地恢复类型信息,只是根据值的范围猜的…… 而对象,因为涉及对象布局、垃圾回收、线程状态、多态调用等信息,会关联相应的Class对象,即“类型”信息。
dracularking 2013-04-06
  • 打赏
  • 举报
回复
引用 16 楼 x19881216 的回复:
@ZangXT 一块内存到底是什么类型,取决你读取和解释的方式。
解释方式对的,但太笼统了,知道肯定知道的 比如两个数据 a = 1111 1111 1111 1111 b = 1111 1111 1111 1111 a和b类型是如何在运行时与它们的数据各自关联的呢,short还是char仅凭数据值无法确定 但很难想象对于一个primitive也就是非对象,jvm还要安排一个关联的类型信息
小绵羊 2013-04-06
  • 打赏
  • 举报
回复
引用 15 楼 dracularking 的回复:
引用 13 楼 x19881216 的回复:引用 12 楼 dracularking 的回复:引用 10 楼 x19881216 的回复:Java虚拟机支持Java语言的基本数据类型如下: byte://1字节有符号整数的补码 short://2字节有符号整数的补码 int://4字节有符号整数的补码 long://8字节有符号整数的补码 float://4字节……
@ZangXT 一块内存到底是什么类型,取决你读取和解释的方式
ZangXT 2013-04-06
  • 打赏
  • 举报
回复
引用 20 楼 dracularking 的回复:
引用 18 楼 ZangXT 的回复:引用 17 楼 dracularking 的回复:引用 16 楼 x19881216 的回复:@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上的指令说明。
dracularking 2013-04-06
  • 打赏
  • 举报
回复
引用 18 楼 ZangXT 的回复:
引用 17 楼 dracularking 的回复:引用 16 楼 x19881216 的回复:@ZangXT 一块内存到底是什么类型,取决你读取和解释的方式。 解释方式对的,但太笼统了,知道肯定知道的 比如两个数据 a = 1111 1111 1111 1111 b = 1111 1111 1111 1111 a和b类型是如何在运行时与它……
那意思只在编译时才有类型信息,这个我觉得有点疑问 char是无符号数,如果对一个char作widening primitive conversion到int 和对一个short作widening primitive conversion到int 这两者的表现是迥异的 比如 a = 1111 1111 1111 1111 b = 1111 1111 1111 1111 假设a是char,b是short a提升是零扩展, (int)a = 0000 0000 0000 0000 1111 1111 1111 1111 b提升是符号扩展 (int)b = 1111 1111 1111 1111 1111 1111 1111 1111 难道widening primitive conversion是发生在编译时的操作?这个也是有可能的,只是还不清楚事实,只是如果发生在编译时的话,它会和很多运行时操作混合在一起(比如提升为int的操作等),实现上可能有点难度
dracularking 2013-04-05
  • 打赏
  • 举报
回复
引用 13 楼 x19881216 的回复:
引用 12 楼 dracularking 的回复:引用 10 楼 x19881216 的回复:Java虚拟机支持Java语言的基本数据类型如下: byte://1字节有符号整数的补码 short://2字节有符号整数的补码 int://4字节有符号整数的补码 long://8字节有符号整数的补码 float://4字节IEEE754单精度浮点数 double:……
是的,涉及到integral type的数据类型都会被提升为int或long来参与运算 但这其实不是我的问题,是在运算之前或非运算操作,系统如何分辨short与char,因为两者长度都是16bit
dracularking 2013-04-05
  • 打赏
  • 举报
回复
field info贴错
dracularking 2013-04-05
  • 打赏
  • 举报
回复
现在基本知道类型信息在编译后是存储于class file structure中,至于运行时如何使用或者擦除还未知





descriptor_index
The value of the descriptor_index item must be a valid index into the
constant_pool table. The constant_pool entry at that index must be a
CONSTANT_Utf8_info (§4.4.7) structure that must represent a valid field
descriptor (§4.3.2).

类型信息由field discriptor描述
小绵羊 2013-04-05
  • 打赏
  • 举报
回复
引用 12 楼 dracularking 的回复:
引用 10 楼 x19881216 的回复: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个类型的指令
dracularking 2013-04-05
  • 打赏
  • 举报
回复
引用 10 楼 x19881216 的回复:
Java虚拟机支持Java语言的基本数据类型如下: byte://1字节有符号整数的补码 short://2字节有符号整数的补码 int://4字节有符号整数的补码 long://8字节有符号整数的补码 float://4字节IEEE754单精度浮点数 double://8字节IEEE754双精度浮点数 char://2字节无符号Unicode字符 几乎所……
谢谢,我就想知道,虚拟机在执行同样是2字节的short和char的时候,如何分辨其类型的?
dracularking 2013-04-05
  • 打赏
  • 举报
回复
引用 9 楼 ZangXT 的回复:
引用 3 楼 dracularking 的回复:引用 2 楼 ticmy 的回复:底层都是二进制位,只是将其解释成字符、整数、浮点数等的问题 我对这类问题缺少体系的认识,可能缺少阅读某一本书 那设立类型其中一个作用是可以节省空间,可以用更小数据进行运算的就不必用int了 那这些数据值连同它的类型信息是以什么形式存储的呢? 可以读一下《深入理解计算机系统》,……
谢谢啊,你终于出现了,好久不见,有空我得好好看看这本书。 <<一块内存到底什么类型,取决你读取和解释的方式。 比如各自16位,short和char,类型信息肯定在16位内存之外吧,单靠这16位数据是无法分辨什么类型的吧?
小绵羊 2013-04-05
  • 打赏
  • 举报
回复
Java虚拟机支持Java语言的基本数据类型如下: byte://1字节有符号整数的补码 short://2字节有符号整数的补码 int://4字节有符号整数的补码 long://8字节有符号整数的补码 float://4字节IEEE754单精度浮点数 double://8字节IEEE754双精度浮点数 char://2字节无符号Unicode字符 几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。
ZangXT 2013-04-05
  • 打赏
  • 举报
回复
引用 3 楼 dracularking 的回复:
引用 2 楼 ticmy 的回复:底层都是二进制位,只是将其解释成字符、整数、浮点数等的问题 我对这类问题缺少体系的认识,可能缺少阅读某一本书 那设立类型其中一个作用是可以节省空间,可以用更小数据进行运算的就不必用int了 那这些数据值连同它的类型信息是以什么形式存储的呢?
可以读一下《深入理解计算机系统》,英文书名是《Computer Systems: A Programmer's Perspective》。 一块内存到底是什么类型,取决你读取和解释的方式。如果了解C/C++等语言的话,可用玩玩指针的类型转换。 你后面引用的class格式定义和这里要了解的问题其实没关系。
dracularking 2013-04-04
  • 打赏
  • 举报
回复
引用 5 楼 happyhq001 的回复:
类型的不同主要是为了节约内存空间 这个类型被定义了之后都是放在内存中,不然怎么来的在内存中开辟一道空间呢
那它对应的类型信息也是放在内存中?它们是怎么关联起来的呢,放在相邻或者有联系的内存空间地址中?类型信息大概要占多少空间呢?
happyhq 2013-04-04
  • 打赏
  • 举报
回复
类型的不同主要是为了节约内存空间 这个类型被定义了之后都是放在内存中,不然怎么来的在内存中开辟一道空间呢
加载更多回复(4)

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧