Java中8位十六进制浮点数的转换例子

22 篇文章 0 订阅
20 篇文章 0 订阅

1.整型

在一台典型的32位机器上一个有符号的int型的取值范围为-2147483648 ~ 2147483647(-2^31 ~ (2^31-1))。也就是说,在一个4字节(32位2进制),除去首位用于符号位表示正负外,其余的31位都是数字的有效位。

2.单精度浮点相关介绍

  • float是单精度浮点型数据,所占字节数为4位,也就是32个比特。
  • float占用4个字节和int是一样,也就是32bit。
  • 第1个bit表示符号,0表示正数,1表示负数。
  • 第2-9个bit表示指数,一共8位为(可以表示0-255),这里的底数是2,为了同时表示正数和负数,这里要减去127的偏移量。这样的话范围就是(-127到128),另外全0和全1作为特殊处理,所以直接表示-126到127。
  • 剩下的23位表示小数部分,这里23位表示了24位的数字,因为有一个默认的前导1(只有二进制才有这个特性)。

    最后结果是:(-1)^(sign) * 1.f * 2^(exponent)
    最大值是:2^128-1
    这里:sign是符号位,f是23bit的小数部分,exponent是指数部分,最后表示范围是(因为正负数是对称的,这里只关心正数。)
    2^(-126) ~~ 2(1-2^(-24)) * 2^127
    这个还不是float的取值范围,因为标准中还规定了非规格化表示法,另外还有一些特殊规定。
    

    V=(-1)^s * M * 2^E (公式1)
    (1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
    (2)M表示有效数字,大于等于1,小于2。
    (3)2^E表示指数位。
    对于32位的float,s占1位,E占8位,M占32位,

    323222-0
    sEM
说明:

(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(32位)(或1023(64位)),得到真实值,再将有效数字M前加上第一位的1。
(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。(这是因为在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。)
(3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。

int a = 3490593;
float b = (float)a;

那么在内存中a和b究竟存放的是什么值呢?

将a展开为二进制,其值为0000 0000 0011 0101 0100 0011 0010 0001,其十六进制即为0x00354321。因为要转化为float型,所以首先要对上述二进制的表示形式改变为 M * 2^E 的形式。由于该数明显大于1,所以按照IEEE的标准,其浮点形势必然为规格化值。
因此 ,转化后的形式为:
a = 1.101010100001100100001 * 2^21
根据规格化值的定义M = 1 + f。所以f = 0.101010100001100100001。
因为float型变量的小数域一共23位。
所以b的最后23位可以得出,其值为101 0101 0000 1100 1000 0100。
下面再演绎指数域的值:因为a的指数表示法中,指数E = 21。根据公式,e = E + (2^7 -1) = 148.所以可以得出b的指数域的二进制表示为:10010100。在加上原数为正,所以符号位s=0。
所以,可以得出b的二进制表示为0 10010100 10101010000110010000100。转化为十六位进制则是0x4A550C84。换句话说,它存储在内存中的值是与a是完全不同的。但是其间还是有关联性的——a的首位为1的数值位后的二进制表示是与b的小数域完全相同的。

结论:

float从左到右,第一位是符号位,2-9位共8位表示整数位,2的8-1次方等于128,后面23位是表示小数的,所以最大值是2^128-1。
double从左到右,第一位是符号位,2-12是共11位表示整数位,2的11-1次方等于1024。剩余20位表示小数,所以最大值是2^1024-1。
可以看出浮点数的取值范围是:2^(-149)~~(2-2^(-23))*2^127,也就是也就是Float.MIN_VALUE和Float.MAX_VALUE。

3.处理方法DEMO

import java.io.*;

{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s="41500000"; 
        Float value = Float.intBitsToFloat(Integer.valueOf(s.trim(), 16)); 
        System.out.println(value); 

        Float f=13.0f; 
        System.out.println(Integer.toHexString(Float.floatToIntBits(f))); 
    }
}

输出结果:13.0
输出结果:41500000

4.方法介绍

Float方法对浮点数与比特的相互转化

浮点数转bit

Float.floatToIntBits(float f) 将一个浮点数转成一个比特序列。返回一个32位整数,表示你作为参数提供的浮点数的 IEEE 754 比特排列。

bit转浮点数

Float.intBitsToFloat(int bits)将传入整数作为一个比特序列,按float对应位置规定意义,转成一个浮点数。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将32位十六进制浮点数转换为十进制浮点数的方法如下: 1. 将32位十六进制浮点数分为三个部分:符号位、指数位和尾数位。 2. 将符号位转换为十进制数,如果符号位为1,表示负数,将其乘以-1。 3. 将指数位转换为十进制数。如果指数位全为0或全为1,则表示特殊值,具体情况需要根据尾数位来确定。如果指数位不全为0或全为1,则需要减去一个偏移量(127),然后将结果转换为十进制数。 4. 将尾数位转换为十进制数。尾数位表示浮点数的小数部分,需要将其转换为二进制小数,然后乘以2的指数位的值(如果指数位为正数,则乘以2的指数位的值;如果指数位为负数,则除以2的指数位的值),最后将结果转换为十进制数。 5. 将符号位、指数位和尾数位的结果组合起来,得到最终的十进制浮点数。 例如,将32位十六进制浮点数0x40490FDB转换为十进制浮点数的步骤如下: 1. 符号位为0,表示正数;指数位为0x049,尾数位为0x0FDB。 2. 符号位为0,不需要乘以-1。 3. 指数位为0x049,需要减去偏移量127,得到0x049 - 127 = -78,然后将结果转换为十进制数,得到-78。 4. 尾数位为0x0FDB,需要将其转换为二进制小数,得到0.11111011011011。由于指数位为负数,所以需要除以2的78次方,得到0.0000000000000000000000000000000000000000000000000000000000000000112513。最后将其转换为十进制数,得到1.121513。 5. 将符号位、指数位和尾数位的结果组合起来,得到最终的十进制浮点数,为1.121513 x 2^(-78)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值