将float型数据转化成int型

  在将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<stdio.h>
#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
}


!!!这种方法在开辟数组时浪费了大量的内存,可以考虑采用动态开辟数组的方法,提高内存利用率。

猜你喜欢

转载自blog.csdn.net/pretysunshine/article/details/81155189