1、整数在Java虚拟机中的表示
Java虚拟机中,整数有byte、short、int、long四种,分别表示8位、16位、32位、64位有符号整数。整数在计算机中使用补码表示,Java虚拟机也不例外。学习补码之前,必须先理解原码和反码。
原码,就是符号位加上数字的二进制表示。以int为例,第1位表示符号位(正数或负数),其余31位表示该数的二进制值。
10的原码:00000000 00000000 00000000 00001010
-10的原码:10000000 00000000 00000000 00001010
反码,就是在原码的基础上,符号位不变,其余位取反。
-10的反码:11111111 11111111 11111111 11110101
负数的补码就是反码加1,正数的补码就是原码本身。
10的补码为:00000000 00000000 00000000 00001010
-10的补码为:11111111 11111111 11111111 11110110
相对于原码,使用补码作为存储方式有两个好处:统一数字0的表示,把0归入正数或负数得到的原码是不同的,但得到的补码是相同的;可以简化整数的加减法运算,只需要将补码简单相加即可得到算数加法的正确结果,无须区别正数和负数。
2、浮点数在Java虚拟机中的表示
在Java虚拟机中,浮点数有float和double两种,分别表示32位和64位浮点数。浮点数由3部分组成,分别是符号位、指数位和尾数位。以32位float为例,符号位s占1位,表示正负数,指数位e占8位,尾数位m占剩余23位。
浮点数-5的表示为:1 10000001 01000000000000000000000
符号位为1,(-1)^1表示负数;指数位为10000001,(1*2^7+1*2^0)表示129;尾数位为01000000000000000000000,因为e不全为0,故尾数位要附加1(否则附加0),故实际的尾数位为101000000000000000000000,(1*2^0+1*2^-2)表示1.25。故浮点数的值为-1*2^(129-127)*1.25=-5。
浮点数float还可以表示一些特殊的数字,如下表所示: