java虚拟机是一台执行java字节码的虚拟计算机,拥有独立的运行机制。 但:java字节码并非由java语言编译而成。如scala生成的java字节码也可以由java虚拟机执行。
不知道你有没有好奇过:我们无论如何都会用到的基本数据类型,在java虚拟机中是怎么表示的呢?
我们从整数和浮点数两种典型的数据类型来举例学习: 1.整数在java虚拟机中的表示。 在java虚拟机中,整数有long,int,short,byte四种。分别对应64位,32位,16位,8位有符号整数。大家都知道,整数在计算机中用补码表示,java虚拟机中也一样。
这里巩固下补码,要说补码,还要先从原码和反码说起。
原码:符合位加上数字都二进制表示。以int为例,第1位表示符合位(0负1正),其他31位表示该数的二进制值。
反码:在原码的基础上,符合位不变,其余位取反。
补码:正数的补码就是其本身(即原码);负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
为什么整数在计算机抑或数java虚拟机中要用补码表示? a.首先,若是用原码或反码表示,则0无法表示,因为0非正非负,若算做正数,则首位符合位为0,若算为负数,则首位符号位为1,这样就有2种表示了,不合理。然后若用补码表示:若0为正,则补码为本身:00000000 00000000 00000000 00000000. 若0为负,则补码为反码加1,-0的反码为 11111111 11111111 11111111 11111111 所以-0的补码为 00000000 00000000 00000000 00000000 所以补码表示,解决了0的存储问题 b.若用补码表示,则只需将补码相加,无需区分正负,或者无需再做减法运算(都用加法表示了,符号位参与了运算,将减法也变成了加法) 这里需要注意下:正负数的补码问题 不难联想到平时可能会遇到的数值溢出。
2.浮点数在java虚拟机中都表示