主要讲单精度,双精度类似。
先看一个程序:
|
#include <stdio.h>
#define uchar unsigned char #define uint unsigned int
void ftoc(float a) { // float a;
uchar i,*px;
uchar x[4]; /*定义字符数组,准备存储浮点数的四个字节*/
void *pf;
px=x; /*px指针指向数组x*/
pf=&a; /*void 型指针指向浮点数首地址*/
// a=34.526;
for(i=0;i<4;i++) { *(px+i)=*((char *)pf+i); /*强制void 型指针转成char型,因为*/ printf("%d: %d \n",i,(int)(*(px+i))); } /*void型指针不能运算*/
}
int main() { float a; while(1) { puts("input:"); scanf("%f",&a); ftoc(a); } getchar(); return 0; }
|
运行如下:

解释如下:
浮点数的存储格式:
浮点数的存储格式是符号+阶码(定点整数)+尾数(定点小数)
SEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMM
即1位符号位(0为正,1为负),8位指数位,23位尾数位
浮点数存储前先转化成2的k次方形式,即:
f = A1*2^k + A2*2^(k-1) + ... + Ak +... +An*2^(-m) (Ai = {0, 1}, A1 = 1)
如5.5=2^2 + 2^0 + 2^(-1)
其中的k就是指数,加127后组成8位指数位
5.5的指数位就是2+127 = 129 = 10000001 (本来是128,为了方便,IEEE规定为127,双精度为1023,我查资料后得出的结论,不知道对不对。)
A2A3.....An就是尾数位,不足23位后补0
所以5.5 = 01000000101000000000000000000000 = 40A00000
所以,对浮点数*2、/2只要对8位符号位+、- 即可,但不是左移、右移
《深入理解计算机系统》第二章中的浮点数存储问题,下面就列一个小事例。

更多请看:
http://blog.chinaunix.net/u/19782/showart_229061.html
http://www.mcu123.com/new/Article_Show.asp?ArticleID=10
http://blog.csdn.net/dreamXren/archive/2005/11/25/536902.aspx