JVM入门--03 浮点数在 Java 虚拟机中是怎么表示的

在 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 方法实现。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值