深入jvm 02. 你真的了解java基本数据类型吗

1、8种基本数据类型

java中共有8种基本数据类型,分别是boolean、byte、short、char、int、float、double、long,其各自的值域和默认值如图所示,虽然默认值看起来各不相同,但在内存中都是0。
在这里插入图片描述
对于boolean、byte、char、short这四种基本类型,如果作为局部变量存储在栈上时,所占空间和int以及reference类型是一样的,32位Hotspot中占4字节,64位中占8字节

如果作为类字段或者数组元素存储在堆中时,情况有所不同。byte、char、short这三种类型将分别占用1字节、2字节、2字节。如果我们把一个int类型的值存入这三种类型的字段或数组中,多出来的字节将会被截断。而boolean类型稍复杂,作为类字段占用的是1字节,boolean数组使用byte数组实现。由于boolean只有0或者1两种可能,在存储的时候只取最后1位的值(其余位为0),存入字段或数组中。

jvm在做算数操作的时候使用的是操作数栈中的元素,那么在计算前,就需要将堆中的boolean、byte、short、char加载到操作数栈中,在栈上时这些类型将被扩展后当做int类型来参与计算。对于boolean和char两种无符号类型,高字节直接用0填充;对于byte和short两种有符号类型,如果原始的最高位为0(表示正),则高二字节用0填充;如果原始的最高位为1(表示负),则高二字节用1填充。

2、java中的正无穷和负无穷

float类型通常有两个0,+0.0F和-0.0F,在java中前者是0,后者符号位为1、其他为均为0,尽管两者内存数值不同,但是如果执行==操作,会返回真。
正无穷=任何正浮点数(不包括+0.0F)除以+0.0F的值,在内存中等同于0x7F800000。
负无穷=任意正浮点数(不包括+0.0F)除以-0.0F的值,在内存中等同于0xFF800000。
而位于[0x7F800001, 0x7FFFFFFF]和[0xFF800001, 0xFFFFFFFF]的数对应的就是NaN(Not a Number)。

猜你喜欢

转载自blog.csdn.net/Longstar_L/article/details/107405775