Java 虚拟机结构

Java 程序语言中的数据类型相似,Java 虚拟机可以操作的数据类型可分为两类:原始类型(Primitive Types,也经常翻译为原生类型或者基本类型)和引用类型(Reference Types)。 与之对应,也存在有原始值(Primitive Values)和引用值(Reference Values)两种类型的数值可用于变量赋值、参数传递、方法返回和运算操作。

二 原始类型与值

Java 虚拟机所支持的原始数据类型包括了数值类型(Numeric Types)、布尔类型(Boolean Type)和 returnAddress 类型三类。其中数值类型又分为整型类型(Integral Types)和浮点类型(Floating-Point Types)两种,

其中整数类型包括:

byte 类型:值为 8 位有符号二进制补码整数,默认值为零。

short 类型:值为 16 位有符号二进制补码整数,默认值为零。

int 类型:值为 32 位有符号二进制补码整数,默认值为零。

long 类型:值为 64 位有符号二进制补码整数,默认值为零。

char 类型:值为使用 16 位无符号整数表示的、指向基本多文本平面(Basic Multilingual Plane,BMP)的 Unicode 值,以 UTF-16 编码,默认值为 Unicode 的 null 值('\u0000')。

浮点类型包括:

float 类型:值为单精度浮点数集合②中的元素,或者(如果虚拟机支持的话)是单精度 扩展指数(Float-Extended-Exponent)集合中的元素。默认值为正数零。

double 类型:取值范围是双精度浮点数集合中的元素,或者(如果虚拟机支持的话)是 双精度扩展指数(Double-Extended-Exponent)集合中的元素。默认值为正数零。 布尔类型:

boolean 类型:取值范围为布尔值 true 和 false,默认值为 false。 returnAddress 类型:

returnAddress 类型:表示一条字节码指令的操作码(Opcode)。在所有的虚拟机支 持的原始类型之中,只有 returnAddress 类型是不能直接 Java 语言的数据类型对应 起来的。

2.1 整型类型与整型值

Java 虚拟机中的整型类型的取值范围如下:

对于 byte 类型,取值范围是从 -128 至 127(-27至 27-1),包括 -128 和 127。

对于 short 类型,取值范围是从 −32768 至 32767(-215至 215-1),包括 −32768 和 32767。

对于 int 类型,取值范围是从 −2147483648 至 2147483647(-231至 231-1),包括 −2147483648 和 2147483647。

对于 long 类型,取值范围是从−9223372036854775808 至 9223372036854775807 (-263 至 263-1),包括 −9223372036854775808 和 9223372036854775807。 

对于 char 类型,取值范围是从 0 至 65535,包括 0 和 65535。

 

2.2 浮点类型、取值集合及浮点值

浮点类型包含 float 类型和 double 类型两种,它们在概念上与《IEEE Standard for Binary Floating-Point Arithmetic》ANSI/IEEE Std. 754-1985(IEEE, New York) 标准中定义的 32 位单精度和 64 位双精度 IEEE 754 格式取值和操作都是一致的。

IEEE 754 标准的内容不仅包括了正负带符号可数的数值(Sign-Magnitude Numbers), 还包括了正负零、正负无穷大和一个特殊的“非数字”标识(Not-a-Number,下文用 NaN 表示)。 NaN 值用于表示某些无效的运算操作,例如除数为零等情况。

所有 Java 虚拟机的实现都必须支持两种标准的浮点数值集合:单精度浮点数集合和双精度浮 点数集合。另外,Java 虚拟机实现可以自由选择是否要支持单精度扩展指数集合和双精度扩展指 数集合,也可以选择支持其中的一种或全部。这些扩展指数集合可能在某些特定情况下代替标准浮 点数集合来表示 float 和 double 类型的数值。

2.3 returnAddress 类型和值

returnAddress 类型会被 Java 虚拟机的 jsr、ret 和 jsr_w 指令所使用。 returnAddress 类型的值指向一条虚拟机指令的操作码。与前面介绍的那些数值类的原始类型 不同,returnAddress 类型在 Java 语言之中并不存在相应的类型,也无法在程序运行期间更改 returnAddress 类型的值。

2.4 boolean 类型

虽然 Java 虚拟机定义了 boolean 这种数据类型,但是只对它提供了非常有限的支持。在 Java 虚拟机中没有任何供 boolean 值专用的字节码指令,在 Java 语言之中涉及到 boolean 类型值的运算,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替。 Java 虚拟机直接支持 boolean 类型的数组,虚拟机的 newarray 指令可以创建这种数组。boolean 的数组类型的访问与修改共用 byte 类型数组的 baload 和 bastore 指令。

三 引用类型与值 Java

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwsgy.html