float数据十六进制表示法,十六进制读取float数据

您所在的位置:网站首页 十六进制表达式是什么字母 float数据十六进制表示法,十六进制读取float数据

float数据十六进制表示法,十六进制读取float数据

#float数据十六进制表示法,十六进制读取float数据| 来源: 网络整理| 查看: 265

今天用微软自带的计算器计算浮点的十六进制码,竟然没有,然后我就查啊查,费了九牛二虎之力才搞懂这个。

float是32位,符号位(正负),小数点位,小数后的位数是这样分配的。

首先,计算机的内数字在内存中是逆序存放的。即1234,实际存放是4321。内存怎么样存放我是不清楚的,只能在硬盘中查看数据。尽管硬盘数据有大端字节序和小端字节序区分,但中文操作系统好像默认都是逆序的小端字节序(little-endian)。

大端字节序

 小端字节序

32位整数在硬盘里的存放顺序,以每8位为一个数字,即每个数都以十六进制来表示,倒着放到硬盘里,类似于8位堆栈。例如整数3,347,750,752,用十六进制表示正常顺序是C7 8A 9F 60,存放在硬盘里就是60 9F 8A C7。

这个顺序是非常重要的,我做音乐播放器几乎天天在查PCM码,每天都要算来算去的。倒序码再熟悉不过了。

但是想研究浮点型,还需要将十六进制转换为二进制。因为浮点的位有特定的用处。

32位浮点型数字,第32位是符号位,紧跟着的8位,即23-31位是指数位,剩下的23位是尾数位。

符号位好理解,即正负位。至于什么是指数位,什么是尾数位,简单说就是:2^(指数位-127)*尾数位 。我们以+0.8,-0.8为例

 先看这两个数的十六进制代码:

 

上图为正,下图为负。 

 

 同样是上正下负。倒序输入计算器后得到二进制数值。

0.8的十六进制:3F4C CCCD

0.8的二进制:0011 1111 0100 1100 1100 1100 1100 1101

正数符号位为0,负数符号位为零

记住,这是倒序的,也就是,从左数第一位是32位,即符号位。 这是最简单,最易理解的。

紧接着的指数位部分011 1111 0,指数位代表什么呢?10进制来说,指数位就是代表了这个数字的位数,十百千万,10^n次位那种,二进制同理。8位可以最多表示256个数,也就是2^256次方,但是因为指数可以有负数的,比如小于1的小数,全是负数。2的0次幂是1,在没有符号位的情况下,我们折中以127为分界限,低于127代表负数,高于127则为正数。即大于1的数。听起来麻烦,实例来看下。

比如1.0000的二进制代码是0011 1111 1000 0000 0000 0000 0000 0000,红字部分是指数位。

即0111 1111,也就是127。指数就是0。2^0=1。1.00000,尾数部分为零

比如0.5000的二进制代码是0011 1111 0000 0000 0000 0000 0000 0000

0.5的指数位是0111 1110,也就是126,127-1,即-1。2^(-1)=0.5,尾数部分为0。

再看下0.25的二进制代码0011 1110 1000 0000 0000 0000 0000 0000

0.25的指数位为0111 1101,值为125,127-2。2^(-2)。

再看下二制无法整除的数字0.3333的二进制码:0011 1110 1010 1010 1010 0110 0100 1100

0111 1101,也是125,即-2次幂。指数提供了0.25这个基础位数,相当于十进制的19,210,304的10,200,300,尾数部分则用来表示9,10,04。0.33的二进制指数位提供了0.25这个部分,即2^(-2),剩下的0.0833则由尾数提供

具体是这样算的:

比如0.4的二进制是0011 1110 1100 1100 1100 1100 1100 1101(尾数)

指数位去掉127为-2,即2(-2)=0.25,0.25的二进制手工表示为0.01,很多教程都不把指数位算进去,最后得出的结果就很坑逼,那是不对的,实际上是这样的,指数位再换算成二进制后得加到后面的尾数位里,即加上尾数位前面,0.4就是0.25+尾数=0.01接上尾数位,0.01100 1100 1100 1100 1100 1101,在内存和硬盘里自然不会有前面的零和点,即0110 0110 0110 0110 0110

因为看了错误的教程,我走了很多弯路才搞清楚,每比较一个浮点数的二进制和十六进制码都需要思考为什么这样,浪费了好多时间。我把这个写这么细,就是希望不要再有人无谓的浪费时间了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3