C51中的浮点数存储方式
Float 浮点形,它是符合IEEE-754标准的单精度浮点形数据,在十进制中具有7位有效数字。FLOAT型据占用四个字节(32位二进制数),在内存中的存放 格式如下:
字节地址(由低到高)0 1 2 3
浮点数内容 MMMMMMMM MMMMMMMM E MMMMMMM S EEEEEEE
其中,S为符号位,存放在最高字节的最高位。“1”表示负,“0”表示正。E为阶码,占用8位二进制数,存放在高两个字节中。注意,阶码E值是以2为底的 指数再加上偏移量127,这样处理的目的是为了避免出现负的阶码值,而指数是可正可负的。阶码E的正常取值范围是1~254,从而实际指数的取值范围为 -126-127。M为尾数的小数部分,用23位二进制数表示,存放在低三个字节中。尾数的整数部分永远为1,因此不予保存,但它是隐含的。小数点位于隐 含的整数位“1”的后面。
例如浮点数124.75 = 42F98000H 在内存中的存放格式为:
字节地址 +0 +1 +2 +3
浮点数内容 00000000 10000000 1 1111001 0 1000010
124.75D=1111100.11B=1.11110011*2E6
阶码=6D+127D=133D=10000101B
符号位=0
字节地址(由低到高)0 1 2 3
浮点数内容 MMMMMMMM MMMMMMMM E MMMMMMM S EEEEEEE
其中,S为符号位,存放在最高字节的最高位。“1”表示负,“0”表示正。E为阶码,占用8位二进制数,存放在高两个字节中。注意,阶码E值是以2为底的 指数再加上偏移量127,这样处理的目的是为了避免出现负的阶码值,而指数是可正可负的。阶码E的正常取值范围是1~254,从而实际指数的取值范围为 -126-127。M为尾数的小数部分,用23位二进制数表示,存放在低三个字节中。尾数的整数部分永远为1,因此不予保存,但它是隐含的。小数点位于隐 含的整数位“1”的后面。
例如浮点数124.75 = 42F98000H 在内存中的存放格式为:
字节地址 +0 +1 +2 +3
浮点数内容 00000000 10000000 1 1111001 0 1000010
124.75D=1111100.11B=1.11110011*2E6
阶码=6D+127D=133D=10000101B
符号位=0
%参考示例程序一: typedef union{ float flt; unsigned char fltc[4]; } Float; main() { Float a; unsigned char i; a.flt=124.75; for(i = 0; i < 4; i++) printf("%x\t",a.fltc); printf("\n"); } %参考示例程序二: main() { float a; unsigned char i; unsigned char *j; a=124.75; j = (unsigned char *)&a; for(i = 0; i < 4; i++) printf("%x\t",j); printf("\n"); }