C语言:将一个32位二进制数转换为带符号的浮点型数

2024-12-03 09:04:07
推荐回答(2个)
回答1:

跟你说原理吧,自己转为代码;
浮点数的保存方式:从左边到右边低位0-31到高位排列。
31位是正负标志,0是正,1是负;
30位是幂的正负标志,0是正,1为负;
20-29位2的幂(不带正负标志)
0-19位是实数的精度
如:浮点数 10101110 10010010 00111001 11111010 是这样表达的
31位1:-; 30位0:幂为正; 20-29位:2^9+2^7+2^6+2^5+2^3+2^0=845
0-19位:是小数精度R=2^-3+2^-7+2^-8+2^-9+2^-12+2^-13+2^-14+2^-15+2^-16+2^-17+2^-18+2^-20
整个浮点数是:-(1+R)*2^845
反转浮点数:例:-89.985759;
将 - 变为31位的1值;接着89.985759>1,幂的符号放30位的值0;
然后将89.985759 表达成1.XXX*2^n样式1.XXX>=1&&1.XXX<2;
89.985759=89.985759/64*2^6=1.406027484375*2^6;
6转为2进制0000000110放在29-20位;1.406027484375去除1变为0.406027484375
0.406027484375表达2进制为(x19)*2*-1+(x18)*2^-2+...+(x1)*2^-19+(x0)*2^-20形式,x19...x0就放在19-0位的值;
0.406027484375的2进制形式为:0110 01111111 00001101
整个32位的表达式位1 0 0000000110 01100111111100001101
这个表达式是浮点数:-89.985759;无符号整数269274893,有符号整数是-893437

回答2:

计算机存储的数据就是你上面的那个十六进制是,至于你要呈现为浮点数,只需要做这个简单的数据拷贝:
float fdata;
unsigned int SourceData = 0xC1480000;

memcpy((viod *)&fdata, (viod *)&SourceData, sizeof(fdata));