在将float型数据转化成int数据前,首先我们要了解float型数据在内存中的存储方式,float类型在内存中占4个字节32个比特位,如下:
0 00000000 00000000000000000000000
1.符号位
其中最左边的为符号位,0为正,1为负。
2.指数
接下来一共8位,也用二进制来表示,系统默认偏移量计算值为127,也就是说,如果你的指数是4,那么内存中存储的就是127+4。
3.尾数
最后尾数是23位的小数部分,系统默认去除了小数点前的1。
接下来以12.25为例,我们具体说下存储方式。将12.25转化成二进制表示,即1100.01,它在内存中的存储为:
首先是符号位,为0,接下来是指数,可以看到它的指数是3(小数点挪到第一个1挪动了3位),则指数为1000 0010,剩下的保留23位,对于无限循环数字取其前23位,如果位数不够,填充零。所以12.25应该表示为:
0100 0001 0100 0100 0000 0000 0000 0000。
弄明白了float的存储,接下来我们要考虑的是怎么将它读取出来方便我们将它转化成int型数据,因此,设计了以下的结构体:
struct Node
{
unsigned int a:23;
unsigned int b:8;
unsigned int c:1;
};
这个结构体的设计基于计算机小端存储在于把float每一个部位的数据读取出来,在根据它的存储机制,计算int值。
具体的代码实现如下:
#include<>
#include <iostream>
using namespace std;
struct Node
{
unsigned int mantissa:23;
unsigned int move:8;
unsigned int sign:1;
};
int Float_int(Node *p)
{
int a=p->mantissa ;
int b=p->move -127;
int ar[23]={0};//开辟一个数组,用于存储23位尾码
for(int i=22;i>=0;--i)
{
ar[i]=a%2;
a=a/2;
}
int x=1;
for(int i=0;i<b;i++)//转化成整形时,只需要读取整数部分,不能忽略系统省去的1。
{
x=x*2+ar[i];
}
if(p->sign ==0)return x;//判断符号
if(p->sign!=0) return -x;
}
int main()
{
float x;
cin>>x;
Node *p=(Node *)&x;
int a=Float_int(p);
cout<<a<<endl;
return 0
}
!!!这种方法在开辟数组时浪费了大量的内存,可以考虑采用动态开辟数组的方法,提高内存利用率。