视频教程:03 浮点数在 Java 虚拟机中是怎么表示的_哔哩哔哩_bilibili
在 Java 虚拟机中,浮点数有 float 和 double 两种,分别是 32 位和 64 位浮点数。浮点数在虚拟机中的表示比整数略显复杂。目前,使用最为广泛的是由IEEE 754 定义的浮点数格式。目前 Java 虚拟机中对于浮点数的处理参考 IEEE 754 的规范。我们将以 float 为例,简要介绍浮点数的表示方法。
在 IEEE 754 的定义中,一个浮点数由 3 部分组成,分别是: 符号位、指数位和尾数位。以32 位 float 为例,符号位占 1 位,表示正负数,指数位占 8 位,尾数位占剩余的 23 位,如下图所示。
其中,sflag 表示符号,当s为0时,sflag 为1,当s为1时,sflag 为-1。m 为尾数值,实际占用空间为 23 位,但是根据 e 的取值,有 24 位精度。当 e 全为 0 时,尾数位附加为 0,否则,尾数位附加为 1。e 为指数位,用 8 位表示。
以浮点数-5 为例,其内部表示为:
1 10000001 01000000000000000000000
符号位为 1 表示负数,指数位为 10000001,表示 129。
尾数位为: 01000000000000000000000。因为e不全为 0,故实际的尾数位为: 101000000000000000000000
尾数位表示 2 的指数次幂的和,每一位表示求和数列中的对应项是否为0,这里表示如下图所示:
故 1 10000001 01000000000000000000000 的值为:
浮点数 float 还可以表示一些特殊的数字,如下表所示:
其中, 指数位全为 1 的表示无穷大和 NaN 等特殊数字。指数位全为 0 的为非规范化的浮点数。
在 Java 中,使用 Float floatToRawIntBits()函数可以获得一个单精度浮点数的IEEE 754 表示。以下代码打印了-5 的内部表示:
float a=-5;
System.out.println(Integer.toBinaryString(FLoat.floatToRawIntBits (a)));
其中,Float.floatToRawIntBits0)函数最终由 C语言的native 方法实现。