- 1, java虚拟机规范中,boolean被映射成int类型,true->1;false->0,编译器遵从了同样的规范。
由于虚拟机中true被映射成int类型,那么直接修改字节码成为非0和非1也是可行的。
浮点类型通常有两个0,+0.0F和-0.0F,两者符号位不同,尽管在内存中数值不同,但是-0.0F==+0.0F会返回真。
java中正无穷和负无穷是有确切的值的,超过之后对应的浮点数是NaN,NaN的一个有趣的特性在于,除了“!=”始终返回true之外,其他比较都会返回false - 2, 堆栈中基本类型存储方式的不同,堆中的基本类型byte和char以及short类型的长度分别位一个字节,两个字节,两个字节,与取值范围吻合,栈中这三种类型的长度都和int类型一致。基于上述原因,当我们人为的修改字节码的值超过取值范围的时候,加载到堆中的时候会进行掩码操作,而栈则不会。同时,当需要将堆中的数据加载到操作数栈的时候,会进行扩充补零操作。基于上述原因,当存在人为的修改字节码的值的时候,需要仔细考虑对计算结果的影响。同时因为虚拟机规范对编译器的约束,上述问题也无需过分担心。
- 3, Java虚拟机每调用一个Java方法的时候,会创建一个栈帧,包含局部变量区和字节码的操作数栈。
深入拆解java虚拟机学习笔记二——java基本类型
最新推荐文章于 2023-08-03 23:43:46 发布