资源描述:
《请问float型数据在mega128中是如何存储的》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、0请问float型数据在mega128中是如何存储的?一个float型数据,占用连续四个字节地址,用iccavr编译,是按照什么规则来编译然后存储的呢?我试了试,好像不像是网上说的按照ieee745标准啊。。。。郁闷了。。。我又弄明白了,原来是我自己搞错了,iccavr也是用得那个统一的ieee745标准。顺便把我看得资料给大家分享一下吧,万一以后大家可能用的着呢:)以下为引用:自学者疑难之一,实型数在计算机中的存储方式Red_Fox笔于2006-12-1217:13 由于关于实型数介绍的资料很少,同时介绍的资料
2、描述得都很简短,各种专业教程中都是简单带过,没有具体的讲解.这样的情况下只好边参考资料边进行逆向分析,经过分析验证后得出以下结论并整理成文档。虽然编写程序时可以不关心它的存储方式,编译器可以自动进行转换,但在许多情况下了解它的存储方式却是个关键。以下的分析目的都旨在于:"知其然,知其所以然".读懂本文所需的前提是了解[补码]实型数的表示,根据IEEE(14)标准分析如下一.先将浮点数转换为二进制数并进行规格化. 1.转换为二进制并规格化一个数时将其调整为大于等于1而小于2,存储时隐含掉整数部分只保留尾数; 如
3、(这部分可以只了解下): 10进制数12 10进制转2进制为: 12=1100; 1100规格化后为: 1.1*2^3这样一个表达式(等同于对1.1左移位3次),2^3表示2的3次方. 12:是正数既符号位为0.存到符号字段中 2^3:3就是阶码. 存到阶码字段中 1.1:.1是尾数. 存到尾数字段中 "1.1"中的整数"1"不需要存储,只存储尾数 如果是0.111这样的二进制数码则调整为1.11*2^-1. 即阶码=-1; 尾数 =11;
4、 数值"12"存储为float的结果是: (数据结构图) 为了对齐行列,各表示:A:符号;B:移码阶;C:尾数.
5、A
6、 B
7、 C
8、
9、0
10、10000010
11、10000000000000000000000
12、 关于B:移码阶部分一定会让人比较迷惑,这里可以先不用管,这部分重点放在第二大段中介绍. 2.浮点数中尾数的二进制转换及规格化 浮点数尾数部分。 通常的转换方式可以转换得出(如除2求余法),但进一步整理下思路可以使后文 更易于理解. 以10进制数:27.
13、4375为例,它们的关系是(书上直接抄来的例子): A冥 B权 C数码 D数值(10进制) A2^42^32^22^12^02^-12^-2 2^-3 2^-4 B16 8 4 2 1 0.5 0.25 0.125 0.0625 C1 1 0 1 1.0 1 1 1 11011.0111(2进制) D16+8+0+2+1+0+0.25+0.125+0.0625 =27.4375二.在机器中的存储方式以float来做分析,存储中位的顺序由高到低描述是:float符号位1bit;阶码位8b
14、it;尾数23bit.共计32bit即4byte长度.符号位: 标识数的正负符号,1表示(-)阶码部分: 由于是8bit;阶为2。因此2的8次方=256个描述信息 规范中,数的表示法有些特别,使用偏移量方式计算。 表示方法为:阶的偏移量E_Disp=127=(256/2-1) 阶码为E表示为存储方式[e]=E+E_Disp 所以,使用存储方式[e]来计算时需要在之上减去E_Disp, 即:E=[e]-E_Disp 此阶码的特点: 这种表示法形式实为补码,但这种表示法不同于普通补码.它使用偏移量计算,
15、 偏移量即补码,同普通补码的区别是末位不进行加1修正. 这种表示法中因为0不应该存在负数,而又没有普通补码表示法的修正,所以 存储0时全存为0 同时这样的方法带来一个额外的空间,原因是表示(+-)127的情况下范围 为:127*2=254实际可用范围为256,0占用1个范围,(+-)127占用254的范围,这 样就是:256-(127*2+1)=1。但是这个描述信息并没有被浪费,它在IEEE(14) 作者:220.172.104.*2007-2-116:17 回复此发言 2 自学者
16、疑难之一,实型数在计算机中的存储方式 规范中用于表示无穷大即:∞。这种方式下无穷表示为:阶码部分全为1,尾码部分 全为0,符号位标识(+-∞). 综合说明: 1.阶码存储为:阶码+偏移量127; 2.被存储的数值为0时不进行任何形式的转换,将其全存为0,符号位唯一确定为0; 3.被存储的数值为+-无穷时阶码位全存为1,尾数位全存为0,符