找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1383|回复: 15
收起左侧

求教浮点数的十进制转十六进制原理和代码

  [复制链接]
ID:1041056 发表于 2022-8-4 21:02 | 显示全部楼层 |阅读模式
50黑币
eg:1对应3F800000
100对应42C80000

十进制是double类型,十六进制是字符
在线转换链接如下,可供验证
ToolTT在线工具箱

回复

使用道具 举报

ID:584814 发表于 2022-8-5 08:14 | 显示全部楼层
浮点数的十进制转十六进制原理可百度
浮点数的十进制转十六进制代码可百度
回答完毕
回复

使用道具 举报

ID:123289 发表于 2022-8-5 08:20 | 显示全部楼层
计算机只认识二进制数,它不认识【负】、【小数点】。怎么办呢?就人为规定一下。
规定,也就是协议。只要“计算机”(其实是使用的人)能遵守这个协议,也就认识【负】、【小数点】了。
显然,协议规定不同,负数、小数的表示方式也就不同(建议在一个系统中,用同样的协议)。
就楼主的问题,稍候给出两种常用的浮点数的表示方式。
关键点:负号在哪?小数点在哪?
回复

使用道具 举报

ID:883242 发表于 2022-8-5 08:44 | 显示全部楼层
你只管用就可以了,无需知道具体代码。但凡是支持浮点数,包括float和/或double的编译器,必定在函数库里面实现了你所需要的功能。
回复

使用道具 举报

ID:401564 发表于 2022-8-5 08:45 | 显示全部楼层
原理就是IEEE规定的数据存放格式,我到现在都不知道怎么转换
但这并不影响我用C语言写程序
我不知道你要知道浮点型转换成16进制有什么用?
回复

使用道具 举报

ID:123289 发表于 2022-8-5 09:01 | 显示全部楼层
两种四个字节组成的浮点数:(一般够用了,如果要求特别,当然可以增加字节数,重新定义)
先给出四个字节:通常从存放的位置看,从低地址至高地址(反之只有你能说清楚也可以),A1,A2,A3,A4。
再细分:A1.0-A1.7,A2.0-......,A4.0-A4.7。
为了方便说明重新定义一下:A4.7=D31,A4.6=D30....,A1.7=D7,......,A1.0=D0,这样就得到一个数:D31,D30,......,D0。
浮点数的第一种表示方式:阶码=D30~D23,符号=D31,底数=1(最高位隐1)+D22~D0 1=3F800000,2=40000000  【我在STM8用过】
浮点数的第二种表示方式:阶码=D31~D24,符号=D23,底数=1(最高位隐1)+D22~D0 1=7F000000,2=80000000  【我在51中用过】
不同的编译平台或软件,可能采用不同的表示方式,亦或是有人故意的。不过不用担心,同一个平台是不可能混淆的。
回复

使用道具 举报

ID:844772 发表于 2022-8-5 09:44 | 显示全部楼层
我试试说一下,不讲单精度了,只说你要的双精度,双精度浮点是8字节,64位,最高位是符号位,显示正负,接着11位是指数位,剩余52位是小数位。它的保存是用科学计数法保存数值,也就是说任何数都以,二进制的小数和二进制的指数表示,例子看你的链接就明白。另外,指数也有正负,所以指数统一加偏移量1023后存储。别看说的麻烦,程序及其简单,因为使用强制类转换,一句搞掂。
double fff=1.0;  //
unsigned char *htext=(unsigned char *)& fff; //其实就这一句就转成十六进制了。
//下面验证一下 htext必然是八字节啊,只是有的系统是从小到大排列
for ( char i=0;i<8;i++)
  printf (" %02x",htext[7-i]);

回复

使用道具 举报

ID:123289 发表于 2022-8-5 09:52 | 显示全部楼层
本帖最后由 yzwzfyz 于 2022-8-5 10:08 编辑

解码:浮点数的值 = [符号]底数 * 2^(阶码-(7FH+23)) = [符号]底数 * 2^(阶码-96H)
23:(这里用10进制写是为了方便您理解),因为底数有24位,其最高位的1就代表2^23。
阶码:小数点的位置。
7FH:(这里用16进制写是突出一个字节0-FFH的中位数7FH,用10进制写成127也一样),这样阶码表示的小数点位置向左向右有127位移动空间。

符号:占1位,1为负数,0为正数。
阶码:占8位,无符号数=0-FFH(0-255),理解为方次,阶码=75,就表示:2的75次方。也可以理解为小数点的位置。
底数:24位,正常的数,补码,只剩余23位:D22-D0,何来24位呢?
特别注意:强制规定(也是妙处),底数虽然没有D23,但就是认为有D23,且D23=1。D23是隐含1!
如果实际中D23偏偏是0呢?比如底数据=0111010……(如果实际底数首位D23=0)。
没有关系,通过将底数左移,必能使首位D23=1,本例左移一位即变成111010……,D23就=1了,再将阶码减去左移的位数,本例阶码-1就平衡掉底数的左移了。
回复

使用道具 举报

ID:123289 发表于 2022-8-5 10:28 | 显示全部楼层
本帖最后由 yzwzfyz 于 2022-8-5 14:39 编辑

1对应3F800000
100对应42C80000
浮点数格式:阶码=D30~D23,符号=D31,底数=1(最高位隐1)+D22~D0

解:3F800000 = 00111111,10000000,0000H
首位:D31 = 0,正数。
阶码:D30-D23 = 0111111,1 = 7FH
底数:D22-D0 = 0000000,0000H,D23强制隐含=1,即底数 = 10000000,0000H = 800000H
解码:3F800000的值 = 800000H * 2^(7FH-(7FH+23)) = 800000H * 2^(-23) = 1

解:42C80000 = 01000010,11001000,0000H
首位:D31 = 0,正数。
阶码:D30-D23 = 1000010,1 = 85H
底数:D22-D0 = 1001000,0000H,D23强制隐含=1,即底数 = 11001000,0000H = C80000H
解码:42C80000的值 = C80000H * 2^(85H-96H) = 13107200 * 2^(-17) = 100
回复

使用道具 举报

ID:123289 发表于 2022-8-5 11:26 | 显示全部楼层
浮点数的十进制转十六进制原理:
第一、这里有个误区:浮点数的十进制?
浮点数在计算机的内存里,几乎都是以二进制格式存储的,如果你要强行将其转成10进制,那么又有新的问题出现,10进制的表达方式是什么?
如123456,可以用6个字节表示:01H,02H,03H,04H,05H,06H。也可以用3个字节表示,即BCD码:12H,34H,56H。
不懂汇编语言,是不太好理解的。
第二、如果浮点数有小数,在16进行中如何表示小数呢?如:3.14。
这个问题涉及浮点数与定点数。比如,用4个字节来表示,前三个字节表示整数,后一个字节表示小数(这叫定点数,规定了小数点的位置,看似简单,却有难点!)。
难点1:整数有限制,不能大于FFFFFFH=16777215,否则溢出,这还好说好解决。
难点2:更麻烦的是,小数0.14,你几乎想象不出它的如何写!
以3.5为例:3.5可以写成:00H,00H,03H,80H。
能不能写成:00H,00H,03H,05H呢?不能!你做个3.5+3.5就知道为何,16进制的0.5为何要写成80H而不是05H了。
讨厌的小数部分0.14如何用16进行表达,就不在这里繁琐了,还是那句话:不懂汇编语言,是不太好理解的。(3.14在这里只能近似地写成00H,00H,03H,24H,而不是00H,00H,03H,14H,小数部分要先乘以256,然后而存入整数部分)
楼主要:【求教浮点数的十进制转十六进制原理和代码】,建议先学通汇编。
否则:就听取楼上其它人的建议吧。
不是不讲给你听,而是比较复杂,你也缺一些课,不易简单地就能让你明白。
回复

使用道具 举报

ID:57657 发表于 2022-8-5 12:23 | 显示全部楼层
Y_G_G 发表于 2022-8-5 08:45
原理就是IEEE规定的数据存放格式,我到现在都不知道怎么转换
但这并不影响我用C语言写程序
我不知道你要知 ...

浮点数的传输、存储可以用union结构进行转换。
回复

使用道具 举报

ID:1034262 发表于 2022-8-5 15:07 | 显示全部楼层
不是编译器处理的吗?不需要自己写程序的。
回复

使用道具 举报

ID:462768 发表于 2022-8-5 17:29 | 显示全部楼层
这种底层的东西,禁止转换,编程入门书上就有
回复

使用道具 举报

ID:139866 发表于 2022-8-9 13:48 | 显示全部楼层
m2006410 发表于 2022-8-5 17:29
这种底层的东西,禁止转换,编程入门书上就有

你也说了,是入门书,而且我估计不是嵌入式入门书
回复

使用道具 举报

ID:593706 发表于 2022-8-9 17:26 | 显示全部楼层
楼主询问的是用单片机转换,还是用计算机转换呀?如果是用计算机进行转换,我的贴子里有现成的转换程序,如果是用单片机转换,稍微复杂一些,单片机转换主要有查表法和数组循环计算法
回复

使用道具 举报

ID:844772 发表于 2022-8-10 22:13 | 显示全部楼层
m2006410 发表于 2022-8-5 17:29
这种底层的东西,禁止转换,编程入门书上就有

打错字了吧,是径直转换,还是个经典程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表