51单片机编程中两个常数0.5和50的表示方法

2019-03-24 19:58发布

在编程中0.5和0.473用浮点数表示分别是3F000000和3EF22D0E,那么,如果是50和62.5该如果表示呢?请行家指教。谢谢! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
David_Lee
1楼-- · 2019-03-24 22:45
经MDK编译观察得出:
50          0x42480000
62.5        0x427a0000

书上说的:
浮点数表示:阶符、阶码、数符、尾数。
阶码用移码,尾数用原码。
leang521
2楼-- · 2019-03-24 23:48

C51浮点数为float类型,占32位。其二进制存储格式遵循IEEE754标准。所以建议你先去看下这个标准。

以float为例:

符号位(S) 阶码(E)    尾数(M)
(31)1位     (30-23)8位    (22-0)23位

符号位:正数为0,负数为1
阶码:(补码形式存放),其中D30是符号位,与一般表示方法不同,它用1表示正,用0表示负。
尾数:(原码形式存放)(注意第一位尾数不出现在内存中,它总是1,故省略了。)

以float 0.5为例:
(1)将十进制数0.5转换为二进制数为:0.1
将这个实数的绝对值转化成二进制格式。(整数部分:除二取余,逆序排列;小数部分:乘2取整,顺序排列。)
(2)将这个二进制格式实数的小数点,左移或右移n位,直到整数部分有且只有一位有效数字(即整数部分必须为一个1)。
则变为:1.0
(3)从小数点左边第一个二进制数字开始,取23位数字放入D22-----D0位(尾数部分)。

**** **** *000 0000 0000 0000 0000 0000

(4)如果该实数为正数,则在D31(数符位)位写入1,负数写入0

0*** **** *000 0000 0000 0000 0000 0000

(5)如果n是左移得到的,则说明指数是正,则在D30位写入1;如果n是右移得到的或n=0,则D30位放入0

00** **** *000 0000 0000 0000 0000 0000

(6)如果n是左移得到的,则将(n-1)后转化成二进制,并在左边补0得到7位二进制数,放入D29----D23中。如果n是右移得到或n=0,则将你转化成二进制后在左边补0得到7位二进制数,然后依次各位取反,对应写入D29-----D23

0011 1111 0000 0000 0000 0000 0000 0000

 

转为16进制位3F0000


lyg水之巅
3楼-- · 2019-03-25 00:45
 精彩回答 2  元偷偷看……
leang521
4楼-- · 2019-03-25 04:59
都可以,事实上浮点数在编程中并不叫浮点数,而是叫实数,我想你数学应该不会很差吧

但是因为浮点数运算很麻烦,所以从算法角度考虑,大部分小数都尽量使用整数方式运算,比如62.5就等于75/2,也就是72>>1这样的表示方式,然后使用算法拆解,尽量在整数时完成全部运算。
abclixu123
5楼-- · 2019-03-25 10:20
51编什么的时候会用到浮点数啊。
lyg水之巅
6楼-- · 2019-03-25 11:49
谢谢!

一周热门 更多>