#include <iostream> #include <bitset> #define N 23//N为要取得小数点后的位数 #define M 64 using namespace std; /*float_str打印浮点数的内存形式*/ char* float_str(float *f) { unsigned int sign,base,exp,t=*(unsigned int*)f; bitset<32> bitset_float(t); int i; /*for(i=32;i>0;--i,cout<<((t>>i)&1))//利用位移打印 if(31==i || 23==i) cout<<"/t"; cout<<endl;*/ cout<<"符号位/t指数位/t/t尾数位"<<endl; for(i=31;i>=0;--i)//利用bitset打印 { if(30==i || 22==i) cout<<"/t"; cout<<bitset_float[i]; } cout<<endl; sign=(t&0x80000000)>>31; exp=(t<<1)>>24; base=t&0x7fffff; cout<<sign<<"/t"<<exp<<"/t/t"<<base<<"/t----十进制"<<endl; cout<<hex<<sign<<"/t"<<exp<<"/t/t"<<base<<"/t----十六进制"<<endl; } /*flaotb根据浮点数f的二进制存储,将其转化为二进制小数 分别取出底数位,和指数位 并进行相应转换 底数位本身就是二进制小数,填补省略掉 1, 然后根据指数值移动小数点*/ char* floatb(float *f) { unsigned int t=*(unsigned int*)f,base;//base为底数 int exp;//exp为指数 static char binary[N+2]={0};//保存浮点数的二进制 int i=1,j=0; //求底数,即浮点数的后23位,并补充被省略掉第24位1 base=(t&0x7fffff)|0x800000; //求指数, 即浮点数的2--9位,先左移1位,然后右移24位,减去127即为指数值 exp=((t<<1)>>24)-127; if(exp<0) { binary[j++]='0'; binary[j++]='.'; while(i<(-exp)) { binary[j++]='0'; ++i; } } // 依次取出底数的二进制位,从第23位取到23-N位 for(i=23;i>23-N;--i) { if(j==exp)//如果第j为exp,赋值为小数点 binary[j++]='.'; binary[j++]='0'+((base>>i)&1); } return binary; } /*floatt 函数通过计算将浮点数转换为二进制小数 分别计算整数位和小数位 整数位通过除2来计算,小数位通过乘2来计算*/ char* floatt(float f) { double part_dec;//part_dec为小数部分 int part_int=0,t;//part_int为整数部分 ,整数部分定义为int型 static char floats[M+2];//结果保存在floats字符数组 int i,j=0,len=1; //同过不断的将浮点数f 减去0.1来求出整数部分的值 while(f>1.0) { f-=1.0; ++part_int; } //f余下的值即为小数部分 part_dec=f; t=part_int; //计算整数部分的二进制有几位,利用了中间变量t; while(t>>=1) ++len; //求整数部分对应的二进制,len为整数部分长度 for(i=len;i>0;--i,floats[j++]='0'+((part_int>>i)&1)); floats[j++]='.'; //小数点 /*求小数部分的二进制,M为总位数,j为整数部分的位数,M-j为小数部分位数 将part_dec*2,如果整数部分为0,该小数位为1,否则为0; 因为浮点数的精度问题,part_dec*2循环多次后,误差会不断积累, 所以能计算的精确度有限*/ for(i=0;i!=M-j;++i) { part_dec*=2; if(part_dec>1.0) { floats[j++]='1'; part_dec-=1.0; } else floats[j++]='0'; } cout<<floats<<endl; return floats; } int main(void) { float fa=0.0755; float_str(&fa); cout<<floatb(&fa)<<endl; floatt(fa); system("pause"); return 0; }