2019-03-24 19:58发布
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
最多设置5个标签!
50 0x42480000
62.5 0x427a0000
书上说的:
浮点数表示:阶符、阶码、数符、尾数。
阶码用移码,尾数用原码。
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
但是因为浮点数运算很麻烦,所以从算法角度考虑,大部分小数都尽量使用整数方式运算,比如62.5就等于75/2,也就是72>>1这样的表示方式,然后使用算法拆解,尽量在整数时完成全部运算。
一周热门 更多>