当前位置:文档之家› 32位浮点数转换为十进制

32位浮点数转换为十进制

流量计计算机通过485端口以MODBUS协议把内部IEEE32位浮点数传送到DCS的数据经过研究试验,其数据格式如下数据请求依次为:十六进制从站地址:01;读命令:03;数据起始高位地址:0F;数据起始低位地址:A0;(0FA0=4000即地址44001);数据长度高位:00;数据长度低位:28;(0028=40即40个地址);CRC效验码:46,E2数据应答格式:从站地址:01;读命令反馈:03;数据长度:50;第一个地址:69;C0;48;A9;第二个地址:C5;00;48;A2;以下类推,直到最后两位CRC:E8;86第一个地址:69;C0;48;A9是如何换算为346958的呢?流量计发送的是IEEE标准的32位浮点数首先要把69;C0;48;A9进行高低16位交换变成:48;A9;69;C0变为32位二进制数:01001000 10101001 01101001 11000000其中最高位为0,代表是正数接下来的八位:10010001变成十进制是145,根据IEEE规范应减去127得18,这是小数点右移的位数;剩下的23位是纯二进制小数即:0.0101001 01101001 11000000加1后得1.0101001 01101001 11000000小数点右移18位后得10101001 01101001 110.00000变为十进制得346958其它地址的32位浮点数计算方法同上标题:《IEEE754 学习总结》发信人:Vegeta时间:2004-11-11,10:32详细信息:一:前言二:预备知识三:将浮点格式转换成十进制数四:将十进制数转换成浮点格式(real*4)附:IEEE754 Converte 1.0介绍一:前言前不久在分析一个程序的过程中遇到了浮点运算,也就顺便学习了一下浮点数的存放格式(IEEE754标准),此文仅作为总结,其中举了几个典型的例子,如果你想深入了解IEEE754标准,我想本文并不太适合您。

二:预备知识-----------------------------------------------------------------------值存储为指数偏移量real*4 1位符号位(s)、8位指数(e),23位尾数(m,共32位) 127(7FH)real*8 1位符号位(s)、11位指数(e),52位尾数(m,共64位) 1023(3FFH)real*10 1位符号位(s)、15位指数(e),64位尾数(m,共80位) 16383(3FFFH)-----------------------------------------------------------------------计算公式:V=(-1)^s*2^E*M当e(各位)为全'0'时,E=1-(2^(e(位数)-1)-1),;M=m。

如:real*4是8位,E=1-(2^(8-1)-1)=1-127=-126即,在real*4时:V=(-1)^s*2^(-126)*m在real*8时:V=(-1)^s*2^(-1022)*m当e(各位)不为全'0'且不为全'1'时,E=e(值)-(2^(e(位数)-1)-1);M=1+m。

即,在real*4时:V=(-1)^s*2^(e(值)-127)*(1+m)在real*8时:V=(-1)^s*2^(e(值)-1023)*(1+m)三:将浮点格式转换成十进制数[例3.1]:0x00280000(real*4)转换成二进制00000000001010000000000000000000符号位指数部分(8位)尾数部分0 00000000 01010000000000000000000符号位=0;因指数部分=0,则:尾数部分M为m:0.01010000000000000000000=0.3125该浮点数的十进制为:(-1)^0*2^(-126)*0.3125=3.6734198463196484624023016788195e-39[例3.2]:0xC04E000000000000(real*8)转换成二进制1100000001001110000000000000000000000000000000000000000000000000符号位指数部分(11位)尾数部分1 10000000100 1110000000000000000000000000000000000000000000000000符号位=1;指数=1028,因指数部分不为全'0'且不为全'1',则:尾数部分M为1+m:1.1110000000000000000000000000000000000000000000000000=1.875该浮点数的十进制为:(-1)^1*2^(1028-1023)*1.875=-60四:将十进制数转换成浮点格式(real*4)[例4.1]:26.0十进制26.0转换成二进制11010.0规格化二进制数1.10100*2^4计算指数4+127=131符号位指数部分尾数部分0 10000011 10100000000000000000000以单精度(real*4)浮点格式存储该数0100 0001 1101 0000 0000 0000 0000 00000x41D0 0000[例4.2]:0.75十进制0.75转换成二进制0.11规格化二进制数1.1*2^-1计算指数-1+127=126符号位指数部分尾数部分0 01111110 10000000000000000000000以单精度(real*4)浮点格式存储该数0011 1111 0100 0000 0000 0000 0000 0000 0x3F40 0000[例4.3]:-2.5十进制-2.5转换成二进制-10.1规格化二进制数-1.01*2^1计算指数1+127=128符号位指数部分尾数部分1 10000000 01000000000000000000000以单精度(real*4)浮点格式存储该数1100 0000 0010 0000 0000 0000 0000 0000 0xC020 0000附:IEEE754 Converte 1.0介绍用IEEE754 Converte 1.0 转换[例3.2]的截图IEEE754 Converter 目前可以对以下数据进行相互转换:┌────────────────────────┐│real*4(HEX)<--->floating point numbers(DEC) ││││real*8(HEX)<--->floating point numbers(DEC) │└────────────────────────┘现举例说明其使用方法:在Softice中用D命令查看内存地址:0050C510,可得:0030:0050C510 00 00 00 00 00 00 4E 40-00 00 00 00 00 00 20 40 ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^并已知数据为REAL*8。

为了方便使用,在[Input]中只需输入:4E40 ,而不用转换成404E。

单击REAL*8中的[HEX--->F-P]按键即可在[Output]中得到结果:60 。

反之亦然:在[Input]中输入:60,按[F-P--->HEX]得:4E40。

补码补码举例1、在计算机系统中,数值一律用补码来表示(存储)。

主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。

另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

2、补码与原码的转换过程几乎是相同的。

数值的补码表示也分两种情况:(1)正数的补码:与原码相同。

例如,+9的补码是00001001。

(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。

例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码0000111按位取反为1111000;再加1,所以-7的补码是11111001。

已知一个数的补码,求原码的操作分两种情况:(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。

(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。

例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。

在“闲扯原码、反码、补码”文件中,没有提到一个很重要的概念“模”。

我在这里稍微介绍一下“模”的概念:“模”是指一个计量系统的计数范围。

如时钟等。

计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。

例如:时钟的计量范围是0~11,模=12。

表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。

任何有模的计量器,均可化减法为加法运算。

例如:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨4小时,即:10-4=6另一种是顺拨8小时:10+8=12+6=6在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。

对“模”而言,8和4互为补数。

实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。

共同的特点是两者相加等于模。

对于计算机,其概念和方法完全一样。

n位计算机,设n=8,所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。

又回了00000000,所以8位二进制系统的模为2^8。

在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。

把补数用到计算机对数的处理上,就是补码。

另外两个概念一的补码(one's complement) 指的是正数=原码,负数=反码而二的补码(two's complement) 指的就是通常所指的补码。

这里补充补码的代数加减运算:1、补码加法[X+Y]补= [X]补+ [Y]补【例7】X=+0110011,Y=-0101001,求[X+Y]补[X]补=00110011 [Y]补=11010111[X+Y]补= [X]补+ [Y]补= 00110011+11010111=00001010注:因为计算机中运算器的位长是固定的,上述运算中产生的最高位进位将丢掉,所以结果不是100001010,而是00001010。

相关主题