原始类型和值
java虚拟机支持的原始数据类型包括运算类型、布尔类型和返回地址类型。运算类型包括整型和浮点型。
整型包括:
byte,8比特有正负的二进制整数,默认值是0;
short,16比特位有正负的二进制整数,默认值是0;
int,32比特位有正负的二进制整数,默认值是0;
long,16比特位有正负的二进制整数,默认值是0;
char,16比特位无符号整数表示基于多文种平台的联合码的值,用utf-16编码,默认值是null编码点(\u0000)。
浮点类型包括:
float,其值是浮点值集的元素或在支持的地方是浮点扩展指数集的元素,默认值是正零
double,其值是双精度值集的元素或在支持的地方是双精度扩展指数的值集的元素,默认值是正零。
boolean类型的值编码了事实值true和false,默认值是false。
在java虚拟机规范第一版中并不认为布尔类型是一个java虚拟机类型。然而布尔值在java虚拟机中有有限的支持。在java虚拟机规范第二版中用创建布尔类型来澄清这个问题。
返回地址类型值指向java虚拟机指令的操作码。作为原始类型,只有返回地址类型不直接与java编程语言类型关联。
整型类型和值
java虚拟机中整型类型的值域分别是:
byte,从-128(包含)到127(包含)(-2^7至2^7-1)
short,从-32768(包含)到32767(包含)(-2^15至2^15-1)
int, 从-214743648(包含)到214743647(包含)(-2^31至2^31-1)
long, 从- 9223372036854775808(包含)到214743647(包含)(-2^63至2^63-1)
char, 从0(包含)到65535(包含)(-2^0至2^16-1)
浮点类型,值域及值
浮点类型包括float和double,它们与32bit单精度和64bit双精度IEEE754格式值和在IEEE 标准中二进制浮点运算说明中的操作相关联。
IEEE754标准不但包含正数和负数,还包含正负零,正负无穷大,一个特殊的不是数值类型值(以下简写为“NaN”)。NaN值用来表示某些非法操作的结果比如0除以0。
每个java虚拟机的实现都要支持两个标准的浮点值集,分别为浮点数值集合双精度浮点数值集。此外,一个java虚拟机的实现可能在其中支持两个中的一个或全部扩展指数浮点值集,称之为浮点扩展指数值集和双精度扩展指数值集。在特定环境下这些扩展指数值集可能用来替代值集来表现浮点或双精度类型的值。
任何有限非零的浮点值集全部能用s?m?2(e-N+1),s为+1或-1,m是一个比2N小的正整数,e是一个从Emin=-(2k-1-2)至Emax=2k-1-1并包含两者的一个整数,N和K是个依赖于值集的变量。许多值能够用多余一种的这种形式来表达,比如:假设在值域中有一个值v能够在这种形式中使用s、m和e恰当值来表达,如果m是一个偶数,e小于2k-1,,我们就能够使用m以及e增加1来同样数值v的第二种表现形式。在这种形式的表达中如果m>=2N-1就称之为标准的,否则表达式称之为非标准的。如果一个值域中的值不能够用m>=2N-1的形式来表达,那么这个值就被称为非标准值,因为它没有标准的表现形式。
对于两个必须和两个可选浮点值集在参数N和K上的约束(还有由此推导的参数Emin和Emax)在表格2.1中进行了总结。
当一个或两个扩展指数值集被实现支持时,每一个被支持的扩展指数值集都有明确的独立实现常量K,K的值按表2.1尽行约束;K值推导了Emin和Emax的值。
四个值中的任何一个不仅包括赋与的有限非零值,还包含正零、负零、正无穷、负无穷和NaN五个值。请注意按表2.1中约束设计,每一个浮点值集元素都是必然的,浮点数扩展指数值集、双精度扩展指数值集也是一样。同样每个双精度值元素是必然的双精度扩展指数值集也一样。每个扩展指数值集比相应的标准值集有更大范围的指数值,但是没有更多的精度。
浮点值集的元素是准确值,它能够用IEEE754标准中定义的单精度浮点格式表示,除了唯一的NaN值外(IEEE 754详细说明224-2与NaN值的不同)。双精度值集的元素是准确的值,它能够用IEEE 754标准中定义的双精度格式表示,除了唯一的NaN值外(IEEE 754详细说明253-2与NaN值的区别)。注意,然而浮点扩展指数和双精度扩展指数数值集的元素并不能分别与IEEE 754中的单精度扩展和双精度扩展格式对应。说明文档并没有要求浮点数集的详细表示方法除了要求在class文件格式中浮点数表示的位置外。
浮点数、浮点数扩展指数、双精度和双精度扩展指数的值集都不是类型。java虚拟机用浮点数值集表示浮点数的实现通常都是正确做法;然而用双精度浮点数值集作为替代的实现也是被允许的。类似的,在java虚拟机的实现当中用双精度值集表示双精度通常是正确做法,然而在相关上下文中,用双精度扩展指数的一个元素替代的实现也是被允许的。
除了NaN的值,浮点值集的值是有序的。当范围从最小到最大时,它们分别是负无穷、负有限值、负零和正零、正有限值、正无穷。
浮点数的正零和负零比较起来是相等的,但还有其他方法可以区分它们;比如:用1.0除以0.0结果为正无穷,用1.0除以-0.0结果为负无穷。
NaN是无序的,所以不论其中一个或两个都是NaN,它们的值比较和值测试结果都是false。特别是,一个与其本身相冲突值相等测试结果为false,当且仅当值是NaN时。一个不相等值的测试结果为true,如果任何一个值为NaN。