1. 程式人生 > >將float型資料轉化成int型

將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
}


!!!這種方法在開闢陣列時浪費了大量的記憶體,可以考慮採用動態開闢陣列的方法,提高記憶體利用率。