废话不多说,先上代码:
#include<iostream>
using namespace std;
//二进制数不变(即01序列不变),从32位float型数据转成32位int型数据
int float2BitInt(float a)
{
int bits[32] = { 0 };
int sign = 0;
float num = a;
if (num < 0.0f)//取float数据的绝对值
{
num = -a;
sign = 1;//符号位,1表示负数,0表示正数
}
bits[0] = sign;
if (num < 1.0f)//小于1
{
float num1 = num;
int bitRight = 0;
while (num1 < 1.0f)
{
num1 *= 2;
bitRight--;
if (bitRight < -126)//若是小于2^-126太小无法精确
break;
}
if (num1 < 1.0f)//小于2^-126
{
//for (int i = 1; i < 32; ++i)
// bits[i] = 0;
int result = 0;
return result;
}
int ex = bitRight + 127;
for (int i = 8; i >= 1; --i)//指数部分的二进制
{
int curr = ex % 2;
ex /= 2;
bits[i] = curr;
}
num1 -= 1.0f;
int iter = 23;
int ii = 0;
while (iter > 0)//尾数部分的二进制数
{
num1 *= 2;
int tmp = int(num1);
num1 -= tmp;
bits[9 + ii] = tmp;
++ii;
--iter;
}
}
else//大于1
{
int numBit = 0;
float currNum = num;
while (currNum > 1.0f)
{
currNum /= 2;
numBit++;
}
int leftShift = std::max(0, numBit - 24);// num / pow(2.0f, );
float smallNum = num / pow(2.0f, leftShift);
int zhenshu = int(smallNum);
float xiaoshu = smallNum - zhenshu;
int em[24];
int numBitOfZhenshu = 0;
while (zhenshu > 0&& numBitOfZhenshu < 24)//得到整数部分的二进制数
{
int curr = zhenshu % 2;
em[numBitOfZhenshu] = curr;
numBitOfZhenshu++;
zhenshu /= 2;
}
int ex = numBitOfZhenshu -1;
int cr = std::min(ex, 23);
for (int i = 0; i < cr; ++i)//得到尾数部分中整数的二进制数
{
bits[i + 9] = em[numBitOfZhenshu-2 - i];
}
int numBitOfXiaoshu = 23 - cr;
int ii = 0;
while (numBitOfXiaoshu > 0)//得到尾数部分中小数的二进制数
{
xiaoshu *= 2;
int curr = int(xiaoshu);
xiaoshu -= curr;
bits[9+cr+ii] = curr;
numBitOfXiaoshu--;
ii++;
}
ex += leftShift;
ex += 127;
for (int i = 8; i >= 1; --i)//得到指数部分的二进制数
{
int curr = ex % 2;
ex /= 2;
bits[i] = curr;
}
}
int result = 0;
for (int i = 1; i < 32; ++i)
{
result += pow(2, 31 - i)*bits[i];
}
result *= (bits[0] == 0 ? 1 : -1);
return result;
}
//二进制数不变(即01序列不变),从32位int型数据转成32位float型数据
float Int2BitsFloat(int num)
{
int bits[30] = { 0 };
int n = num;
bits[0] = 0;
if (n < 0)
{
n = -num;
bits[0] = 1;
}
int iter = 31;
while (iter > 0)
{
int curr = n % 2;
bits[iter] = curr;
n /= 2;
--iter;
}
int sgn = bits[0];
int ex = 0;
for (int i = 1; i <= 8; ++i)
{
ex += pow(2, 8 - i)*bits[i];
}
ex -= 127;
float result = pow(2.0f, ex);
for (int i = 9; i < 32; ++i)
{
result += pow(2.0f, ex - i + 8)*bits[i];
}
result *= pow(-1.0f, sgn);
return result;
}
//打印float型数的二进制数(32位01序列)
void FloatToString(float fNum)
{
unsigned int nData = ((unsigned int *)&fNum)[0];
char* pStr = new char[32];
for (int i = 0; i < 32; i++)
{
pStr[31 - i] = (char)(nData & 1) + '0';
nData >>= 1;
}
pStr[32] = '\0';
for (int i = 0; i < 32; ++i)
std::cout << pStr[i];
std::cout << std::endl;
delete[] pStr;
pStr = NULL;
}
int main()
{
float a;
std::cout << "please input float number:" << std::endl;
while (cin >> a)
{
std::printf("float number:%.10f\n",a); //打印输入浮点数
int result=float2BitInt(a); //将浮点数转成32位整数
std::cout << "int bit number:" << result << std::endl;//打印32位整数
float result1=Int2BitsFloat(result); //整数转成浮点数
std::printf("float number:%.10f\n", result1); //打印转换后的浮点数
std::printf("result - a = %.10f\n", result1-a); //打印转换前后浮点数之差,验证结果是否正确
}
return 0;
}